23

大規模なMFCUIアプリケーションをどのように単体テストしますか?

長年開発されてきた大規模なMFCアプリケーションがいくつかあります。いくつかの標準的な自動QAツールを使用して、基本的なスクリプトを実行し、ファンダメンタルズをチェックしたり、ファイルを開いたりします。これらは、デイリービルド後にQAグループによって実行されます。

ただし、個々の開発者がコードをデイリービルドに送信する前に、ダイアログ、メニュー、およびアプリケーションの他の視覚要素に対してテストをビルドして実行できるような手順を紹介したいと思います。

デバッグビルドでのみ表示されるダイアログの非表示のテストボタンなどの手法について聞いたことがありますが、このための標準的なツールキットはありますか。

環境は、C ++ / C / FORTRAN、MSVC 2005、Intel FORTRAN 9.1、Windows XP / Vista x86&x64です。

4

7 に答える 7

14

MFCについておっしゃっていたので、自動テストハーネスの下で入手するのが難しいアプリケーションがあると思いました。コードを記述しながらテストを構築すると、単体テストフレームワークの最大の利点がわかります。ただし、テスト可能に設計されていないアプリケーションにテスト駆動方式で新しい機能を追加しようとすると、大変な作業になる可能性があります。そしてよくイライラします。

今私が提案しようとしているのは間違いなく大変な仕事です..しかし、ある程度の規律と忍耐力があれば、すぐにメリットがわかります。

  • まず、新しい修正に少し時間がかかるように、管理の裏付けが必要になります。全員がその理由を理解していることを確認してください。
  • 次に、WELCの本のコピーを購入します。時間がある場合はカバーごとに読んでください。または、苦労している場合は、インデックスをスキャンして、アプリが示している症状を見つけてください。この本には多くの良いアドバイスが含まれており、既存のコードをテスト可能にするために必要なものです。 代替テキスト
  • 次に、新しい修正/変更のたびに、時間をかけて、作業する領域を理解します。現在の動作を実行するために、選択したxUnitバリアント(無料で入手可能)でいくつかのテストを記述します。
  • すべてのテストに合格することを確認してください。必要な動作やバグを実行する新しいテストを作成します。
  • この最後のテストに合格するコードを記述します。
  • 設計を改善するために、テスト中の領域内で容赦なくリファクタリングします。
  • これ以降、システムに加える必要のある新しい変更ごとに繰り返します。この規則の例外はありません。
  • 今や約束された土地:すぐに成長し続ける、十分にテストされたコードの島が表面化し始めます。ますます多くのコードが自動テストスイートに分類され、変更が徐々に簡単になります。そしてそれは、基礎となる設計がよりゆっくりと確実にテスト可能になるためです。

簡単な方法は私の以前の答えでした。これは難しいですが、正しい方法です。

于 2008-09-20T13:00:19.883 に答える
14

アプリの構造によって異なります。ロジックとGUIコードが分離されている場合(MVC)、ロジックのテストは簡単です。Michael Feathersの「HumbleDialogBox」(PDF)をご覧ください。

編集:あなたがそれについて考えるならば:アプリがそのように構造化されていない場合は、非常に注意深くリファクタリングする必要があります。ロジックをテストするための他の手法はありません。クリックをシミュレートするスクリプトは、表面を傷つけているだけです。

それは実際にはかなり簡単です:

ユーザーがボタンをクリックしたときにコントロール/ウィンドウ/リストボックスの内容を変更するものが何であれ、クリック後にリストボックスに適切なものが含まれていることを確認したいとします。

  1. リストボックスに表示する項目を含む別のリストが存在するようにリファクタリングします。アイテムはリストに保存され、データの取得元から抽出されることはありません。リストボックスリストを作成するコードは、新しいリストについてのみ認識します。
  2. 次に、ロジックコードを含む新しいコントローラーオブジェクトを作成します。ボタンクリックを処理するメソッドは、mycontroller-> ButtonWasClicked()のみを呼び出します。リストボックスなどについては知りません。
  3. MyController :: ButtonWasClicked()は、目的のロジックに対して実行する必要があることを実行し、アイテムリストを準備して、コントロールに更新するように指示します。これを機能させるには、コントロールのインターフェイス(純粋な仮想クラス)を作成して、コントローラーとコントロールを分離する必要があります。コントローラはそのタイプのオブジェクトのみを認識し、コントロールは認識しません。

それでおしまい。コントローラにはロジックコードが含まれており、インターフェイスを介してのみ制御を認識します。これで、コントロールをモックすることで、MyController :: ButtonWasClicked()の通常の単体テストを記述できます。私が何について話しているのかわからない場合は、Michaelsの記事を読んでください。2回。そしてまたその後。
(自己への注意:それほど吹き飛ばさないことを学ばなければなりません)

于 2008-09-20T10:40:33.993 に答える
3

完璧ではありませんが、これについて私が見つけた最高のものは AutoIt http://www.autoitscript.com/autoit3です

「AutoIt v3 は、Windows GUI と一般的なスクリプトを自動化するために設計された、フリーウェアの BASIC に似たスクリプト言語です。シミュレートされたキーストローク、マウスの動き、およびウィンドウ/コントロール操作の組み合わせを使用して、他の方法では不可能または信頼できない方法でタスクを自動化します。また、AutoIt は非常に小さく、自己完結型であり、煩わしい「ランタイム」を必要とせずに、箱から出してすぐに Windows のすべてのバージョンで実行できます!"

これは、駆動するコントロールのリソース ID 番号を使用できるため、駆動されるアプリケーションのソース コードにアクセスできる場合にうまく機能します。このようにして、特定のピクセルでのシミュレートされたマウス クリックについて心配する必要はありません。残念ながら、レガシ アプリケーションでは、リソース ID が一意ではなく、問題が発生する可能性があります。でも。ID を一意に変更して再構築するのは非常に簡単です。

もう 1 つの問題は、タイミングの問題が発生することです。私は、これらに対する実証済みの真の解決策を持っていません。試行錯誤は私が使用したものですが、これは明らかにスケーラブルではありません。問題は、スクリプトが次のコマンドを発行したり、正しい応答を確認したりする前に、AutoIT スクリプトがテスト アプリケーションがコマンドに応答するのを待たなければならないことです。待機して監視するのに便利なイベントを見つけるのは簡単ではない場合があります。

私の感覚では、新しいアプリケーションを開発する際に、一貫した方法で「READY」を知らせることを主張したいと思います。これは、人間のユーザーだけでなく、テスト スクリプトにも役立ちます。これはレガシーアプリの課題かもしれませんが、問題点に導入し、メンテナンスを重ねながらゆっくりとアプリ全体に広げていくことができるのではないでしょうか。

于 2008-09-20T15:09:49.307 に答える
2

UI 側は扱えませんが、Boost Test ライブラリを使って MFC コードの単体テストを行っています。開始に関する Code Project の記事があります。

Boost を使用した堅牢なオブジェクトの設計

于 2008-09-20T17:19:03.617 に答える
1

職場には、これらの巨大なMFCアプリの1つがあります。維持したり伸ばしたりするのは非常に苦痛です...今は大きな泥だんごですが、ムーラをかき集めます。とにかく

  • スモークテストなどにはRationalRobotを使用しています。
  • ある程度の成功を収めたもう1つのアプローチは、VBScriptといくつかのControlハンドルスパイマジックを使用する小さな製品固有の言語とスクリプトテストを作成することです。一般的なアクションをコマンドに変換します。たとえば、OpenDatabaseは、必要なスクリプトブロックを挿入して、[メインメニュー]>[ファイル]>[開く...]をクリックするコマンドになります。次に、そのような一連のコマンドであるExcelシートを作成します。これらのコマンドもパラメータを取ることができます。FITテストのようなものですが、もっと作業が必要です。一般的なコマンドのほとんどを特定し、スクリプトを準備したら。新しいテストを作成するために、スクリプト(CommandIDでタグ付けされたもの)を選択してアセンブルします。テストランナーはこれらのExcelシートを解析し、すべての小さなスクリプトブロックをテストスクリプトに結合して実行します。

    1. OpenDatabase "C:\ tests \ MyDB"
    2. OpenDialog「モデルの追加」
    3. AddModel "M0001"、 "MyModel"、2.5、100
    4. PressOK
    5. SaveDatabase

HTH

于 2008-09-20T10:10:57.840 に答える
0

実際には、Rational Team Test、次に Robot を使用してきましたが、Rational との最近の話し合いで、Rational が .NET に重点を置いたネイティブ x64 アプリケーションをサポートする計画がないことを発見したため、自動 QA ツールに切り替えることにしました。これは素晴らしいことですが、ライセンス コストの関係で、すべての開発者に対して有効にすることはできません。

私たちのすべてのアプリケーションはスクリプト用の COM API をサポートしており、VB を介して回帰テストを行いますが、これはアプリケーション自体ではなく API をテストします。

理想的には、cppunit や同様の単体テスト フレームワークを開発者レベルでアプリケーションに統合する方法に興味があります。

于 2008-09-20T12:24:12.857 に答える