質問

組み込み環境や、テストを自動化する可能性が非常に限られているその他の状況で回帰テストを実行するための優れたプラクティスと戦略は何ですか。

私の経験では、テストの多くは手動で実行する必要があります。テスターは一連のボタンを押して、マシンが正しく動作することを確認する必要があります。開発者として、自分の変更が他のものを壊さないことを保証するのは非常に困難です。

適切な回帰テストがなければ、大規模なリファクタリングなどの際に状況はさらに悪化します。

問題を認識している人はいますか?この種の問題に対処するための適切な解決策やプロセスは見つかりましたか?

役に立ちましたか?

解決

個人的に、私は、ターゲットハードウェアと自分のコンピュータの両方にコンパイル私の埋め込みコードを持っていることの大ファンです。 8086を標的とする場合、例えば、私は8086のハードウェアおよびDOSエントリポイントにリセットするマップエントリポイントの両方が含まれていました。ハードウェアは、すべてのIOたメモリがマッピングされたように設計されました。私はその後、条件付きで、ハードウェア・シミュレータでコンパイルし、条件付きでシミュレートされたハードウェアメモリにハードウェアのメモリ位置を変更します。

私は非x86プラットフォーム上で動作するようにした場合は、

、私はおそらく代わりにエミュレータを記述します。

の別のアプローチは、ハードウェアのすべての入力と出力はソフトウェアによって制御されている試験装置を作成することです。私たちは、工場出荷時のテストでこのロットを使用します。

一つの時間は、我々はIOのハードウェアにシミュレータを構築しました。こうすることで、システムの残りの部分は、シミュレートされたモードにハードウェアを配置するCANの上にいくつかのコマンドを送信することにより試験することができます。同様に、よく織り込まソフトウェアはIOがソフトウェアコマンドに応答してシミュレートされた「シミュレートされたモード」を持っている可能性があります。

他のヒント

埋め込まれたテストのために、私はあなたが非常に早い開発プロセスのこののあなたの方法を設計することをお勧めします。 PCプラットフォーム上で実行するために、あなたの埋め込みコードをサンドボックス化することは多くのことができますし、次に:)その後からかうん。

このは、そのほとんどのためintegretyを確保しますが、あなたはまだ後で手動でシステムと受け入れテストを行う必要があります。

問題を認識している人はいますか?

確実に。

この種の問題に対処するための良い解決策やプロセスを見つけましたか?

テクニックの組み合わせ:

  • 自動テスト。
  • ブルートフォーステスト、つまり自動テストほどインテリジェントではありませんが、長期間 (数時間または数日) にわたって機能を繰り返しテストし、人間の介入なしで実行し続けることができるもの。
  • 手動テスト (多くの場合、回避するのは困難です)。
  • PC 上のソフトウェア エミュレータ (または最後の手段としてハードウェア エミュレータ) でテストします。

PC コンパイラでのコンパイルについては、次のとおりです。これは、高レベルのモジュールにとってはもちろん、テストに適したハーネスを備えた低レベルのモジュールにとっても理にかなっています。

たとえば、複数のソースからのリアルタイム信号を処理する必要があるコード部分に関しては、エミュレーションから始めるのが良いですが、それだけでは十分ではないと思います。多くの場合、できるだけ現実的な環境で実際のハードウェア上でコードをテストすることに代わるものはありません。

ほとんどの応答とは異なり、これまで、私はすべてのデスクトップシステムに似ていないので、デスクトップ上に組み込みシステムをエミュレートすることはできません組み込み環境で動作します。

は、優れたテストシステムを記述するためには、フィードフォワードとフィードバックを持っているあなたのテストシステムを必要としています。 JTAGは、デバイスを制御するための最も一般的なフィードフォワード方法です。あなたは(あなたが幸運ならおそらく全体のボード)デバイスの完全な状態を設定し、実行するテストコードを設定することができます。その時点で、あなたのフィードバックを得ます。 JTAGは、フィードバックデバイスとして機能することができます。しかし、ソフトウェアのAPIとロジック・アナライザは、このような状況では最高です。あなたは、ピン上の特定のレベルを探しパルスをカウントしても、周辺機器をストリーミングからのデータストリームを解析することができます。

個々のサブシステムのためのテストハーネス/サンドボックス/モックアップを提供し、プロジェクト全体のため、ターゲット環境をエミュレートしています。

これは、あなたが意志合理的に確信している実環境でのテストの必要性を削除し、それらはすべてが通過時間によるので、シミュレーションはほとんどの問題をキャッチするように大きくその数を減らし、あなたは高価な人間主導のテストを実行しません。その最初の時間を渡します。

別に提案から、これまでに構築することができ、あなたのアプリを保証について そして、、少なくとも部分的にもために有用である(通常のPCの上でテストします 私はあなたのソフトウェア設計を考えるでしょうValgrindのようなツール)を使用します。

私が働いていた一つのプロジェクトには、1つのハードウェアを駆動するためのコンポーネントを持っていました 管理タスクおよびネットワーク管理の他に対処するため。 それを書くのは簡単だったように、ネットワーク管理は、SNMPによって処理されました 何かをするためのハードウェアを駆動するためにリモートで走ったスクリプトます。

私は簡単なスクリプトの読者を書いた低レベルのハードウェアテストを実行するには それは、テストスクリプトを解析され、私のIPCにコマンドを注入し ドライバ。出力はビデオ基づくものであったとして、自動化することが難しかったです 目以外による取り扱いの検証、それは確かに保存 私RSI。また、スクリプトにそのストレスを生成するのに非常に有用でした バグがなかったことを確認するためにテストまたは既知の障害状態をシミュレート 再発生します。

私はもう一度それをやっている場合は、

私はおそらく共有を実装します コアを送信するためにテストハーネスと実際のコードで使用されるライブラリ メッセージ。私は、Pythonでのlib(または何かを包むだろう 似ている)ので、私のテストはもう少し「スクリプト可能」可能性があります。

私は自動化されたハードウェアが必要不可欠であると言う皆に同意する - 私たちはいくつかのユニット組み込みソフトウェアをテストするために、そのアプローチを使用しています。私たちは、ハードウェア・シミュレータの完全な大規模な2ラックテストステーションを築いてきたし、我々はそれのすべてを管理するために、LabVIEWのVI、C#のコード、ベンダーのDLLなどのミックスとNI TestStandのを使用しています。私たちは、多くのハードウェアをテストする必要があります - 私たちはそのがらくたのすべてを持っている理由です。あなただけのソフトウェアをテストしているなら、あなたは裸の必需品にそれを縮小することができます。シリアルインタフェースのテスト?ただ、シリアルトラフィックをシミュレートし、ソフトウェアが正しく応答を確認するために、メッセージ(およびいくつかの非有効なメッセージ)のすべてを行使するためにデバイスを構築します。テストDIO?それは簡単、そこにDIOをシミュレートするために、USB周辺機器や組み込み機器の多くがあるのです。タイミングが重要である場合は、それ以外の場合はPCだけで罰金を行います、あなたが探している厳しい公差を得るために、他の組み込みデバイスを使用する必要があります。

重要な部分は、常にあなたがそれ以外のものをテストするためにテストしていないかを知ることです。それはソフトウェアだ場合は、テストが可能最大程度にハードウェアに依存していることを確認してください。あなたはD / Aと波形生成や何かをテストしている場合は、タスクを分離 - D /の予定シーケンスを吐き出す以外空想何もしない、組み込みデバイス上のソフトウェアの特殊なビルドとハードウェアをテスト電圧レベル。次に、あなたの参照がオフになっている場合は、あなたのフィルタが間違っている周波数などに設定されている場合、その後、あなたは、ハードウェアのソフトウェアの独立をテストすることができるはずです見ることができます - ソフトウェアをテストし、プロセッサの動作を検証するために開発ボードを使用しますピンが正しいです。

私が働いている場所で使用されているソリューションは、夜間のビルドとテストの手順を自動化することです。

  1. ソース管理からトランク ヘッド コードを確認します。
  2. プロジェクトをビルドしてターゲットにロードします。
  3. PC 制御の自動テスト スクリプトを実行します。

何らかの通信プロトコルを使用している場合、テスト スクリプトは簡単に実行できます。これは内部単体テストに適しています。この状況をより興味深い (そして徹底的な) ものにするのは、外部 IO をシミュレートするためにボードに差し込むワイヤリング ハーネスを作成することです。

エミュレーションは開発や基本的な初期テストには適していますが、システム検証の信頼できる唯一の方法は実際の物理動作時間です。物理的な動作により、電圧低下、ノイズ、グリッチ、デバウンスの問題、競合状態などのコード以外の問題 (コーディング方法によって引き起こされる) を見つけることができます。

長期にわたるシステムテストも重要です。数日または数週間連続でシステムを悪用する自動テストを設定することは、現場で数か月後まで発生しない可能性がある問題を強制的に排除する良い方法です。事態がおかしくなり始めたら電源を入れ直すように顧客に指示するのは、どの業界でもできる贅沢ではありません。

私の経験では、自動化されたハードウェアのテストが重要となっています。 - PC&ターゲットの両方でデュアルコンパイルへの投資は「素敵な持っている」機能が、選択肢を考えると、私はむしろ自動化されたハードウェアテストに投資のだです。製造腕が/障害解析のためにとにかく能力が必要になるでしょうので、それは最終的に、より費用対効果の高いソリューションになるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top