問題タブ [dunit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unit-testing - Bold for Delphi フレームワークでコーディングする場合のテスト容易性の向上
背景 私は、物流システムに取り組む 7 人の開発者と 2 人のテスターのチームで働いています。Delphi 2007 と、Bold for Delphiをフレームワークとして使用したモデル駆動型開発を使用しています。このシステムは現在約 7 年間運用されており、約 170 万行のコードがあります。4 ~ 5 週間後に本番環境にリリースし、ほぼすべてのリリース後に、見つかっていないバグに対していくつかのパッチを適用する必要があります。もちろん、これは私たちと顧客の両方にとって苛立たしいことです。
現在のテスト もちろん、ソリューションはより自動化されたテストです。現在、手動テストを行っています。空のデータベースで開始し、モデル化されたメソッドからデータを追加する Testdbgenerator。また、GUI をテストするための非常に基本的なスクリプトを実行するTestcompleteもあります。時間がないため、これ以上テストを追加することはできませんが、スクリプトはアプリケーションの変更にも敏感です。数年前、私は DUnit で単体テストを実際に試みましたが、数日後にあきらめました。ユニット同士のつながりが強すぎる。
単体テストの前提条件 単体テストの前提条件 をいくつか知っていると思います。
- 1 つのことを行う小さなメソッドを作成しますが、それをうまく実行します。
- 繰り返さないでください。
- 最初に失敗するテストを書き、次にテストがパスするようにコードを書きます。
- ユニット間の接続は緩んでいる必要があります。彼らはお互いについてあまり知らないはずです。
- 依存性注入を使用します。
使用するフレームワーク 主に 64 ビット コンパイラのため、Delphi XE2 にアップグレードする可能性があります。私はSpringを少し見てきましたが、これにはD2007からの更新が必要であり、今は起こりません. 多分来年。
質問 ほとんどのコードはまだ自動的にテストされていません。では、古いコードのテスト容易性を高めるための最善の道は何でしょうか? それとも、新しいメソッドのみのテストを書き始めるのが最善でしょうか? 自動テストを増やす最善の方法が何であるかはわかりませんが、それについてのコメントは大歓迎です。現在 D2007 + DUnit を使用して、後で Delphi XE2 + Spring に簡単に変更できますか?
編集:手動テストの現在のテスト方法論については、クリスが言うように、「それを叩いて壊そうとする」だけです。
delphi - テスト ケース ウィザードによって生成された DUnit テスト ケース クラスをカスタマイズするにはどうすればよいですか?
Delphi によってインストールされたファイルを調べたところ、ファイルが見つかりました
"C:\Program Files\Embarcadero\RAD Studio\7.0\ObjRepos\en\UnitTestFrameworks.xml"
このファイルには、新しいテスト ケース ユニットを作成するときに呼び出されるテスト ケース ウィザードによって生成されるテスト ケース コードに影響するオプションを設定するためのセクションがいくつかあります。これらのオプションのほとんどは自明ですが、いくつかのドキュメントを参照してください。
特に、次のことを行いたいと思います。
2 つ目の TestClassComment を追加します。
ウィザードのテスト ケース基本クラス コンボ ボックスに複数のオプションがあります。UnitTestFrameworks.xml ファイルのノードの値を変更することで、このリストの 1 つの項目の値を変更できますが、複数の項目をリストに表示することはできません。
テスト クラスとメソッドをいくつかの属性でマークアップします。
今のところ、Delphi Win 32 のパーソナリティだけを見ています。
私はここで正しい軌道に乗っていますか?ドキュメントは利用可能ですか、それとも失敗していますか?誰かヒントはありますか?
unit-testing - 依存関係を壊して単体テストを有効にする方法
単体テストについて考えるのに多くの時間を費やしました。少なくとも、以前のコードを使った効率的な作業を電子ブックとして購入しました。古いコードの単体テストに関する素晴らしい本のようです。しかし、それでも私たちのプロジェクト Attracs は大きいので、これには出発点が必要だと思います。ユニットテストに関する私の一般的な質問も参照してください。
このアプリケーションには、クラス、属性、および関係を定義し、Bold for Delphi を使用するための UML モデルがあります。モデルを変更するたびに、ラウンドトリップを行います。これにより、ファイル businessclasses.pas および BusinessClasses_Interface.inc 内のメソッドの宣言が自動的に生成されます。変更にデータベースの変更が必要な場合は、SQL スクリプトも生成されます。これは何年もうまく機能していますが、単体テストを使用したことはありません。
そのため、新しいテストプロジェクトを追加すると、依存関係が問題を引き起こします。私は得た
[DCC エラー] Attracs_Interface_Uses.inc(10): F1026 ファイルが見つかりません: 'MsxSupport.dcu'
エラーを要約すると
AttracsTest.dpr は、Attracs_Interface_Uses.inc を使用する
BusinessClasses_Interface.inc
を使用する
BusinessClasses.pa を使用します。
では、どうすれば依存関係の連鎖を断ち切ることができますか?
実際には、ファイルははるかに大きいことに注意してください。モデルには 300 以上のクラスがあり、businessClasses.pas には 53000 行以上のコードがあります... テストケースとして、メソッド AddResponsibility を持つクラス TPerson しかありません。しかし、あなたは原則を理解する必要があります。
ここに私のファイルがあります:
AttracsTest.dpr
TestBusinessClasses.pas
Attracs_Interface_Uses
BusinessClasses_Interface.inc
Businessclasses.pas
株式会社パーソン
delphi - DUnit テストの階層
現在、DUnit で 2 レベルのテスト階層を使用しています (テスト プロジェクト -> テスト ケース -> テスト メソッド。以下の例を参照)。3 レベル以上のレベルを導入することは可能ですか?

delphi - DUnit で「パラメータ化された」テストを記述できますか
DUnit を使用して Delphi ライブラリをテストしています。関数への複数の入力をチェックするために、いくつかの非常によく似たテストを作成する場合があります。
DUnit でパラメータ化されたテストを (似たようなもの) 書く方法はありますか? たとえば、入力と期待される出力を適切なテスト プロシージャに指定し、テスト スイートを実行して、テストの複数回の実行のうちどれが失敗したかについてのフィードバックを取得しますか?
(編集:例)
たとえば、次のような 2 つのテストがあるとします。
まったく同じことを行うが、入力と期待が異なるこれらのテストがさらに増える可能性があります。それらを個別に合格または不合格にしたいので、それらを 1 つのテストにマージしたくありません。
delphi - DUnit GUI テスト:「アプリケーション」を別の「フォーム」に強制できますか?
メインフォームが動的にフレームを作成するアプリケーションに対して、DUnit を使用して GUI 単体テストを実行しようとしています。テストケースのフォームとしてテストアプリケーションのメインフォームを作成し、そのメニュー項目などにアクセスすることができました.
アプリケーションがフレームを動的に作成しようとすると、問題が発生します。フレームのリソース読み取りは、ウィンドウ ハンドルが必要なポイントに到達します (私の場合は、タブ シートのキャプションを設定します)。ここでは、TWinControl.GetHandle から TWinControl.CreateWnd および TCustomFrame.CreateParams に移動します。
この CreateParams では、コードは次のように述べています。
ここで違いが生じます。(テストではなく) 実際のアプリケーションを実行すると、ここの Application.Handle はゼロ以外の数値を返し、フローは正常に続行されます。しかし、DUnit テスト アプリケーションでは、ここの Application.Handle は 0 を返します。これにより、TWinControl.CreateWnd 内のコードで、フレームに親がないことを伝える例外が発生します。
私はこの問題 (そして一般的にはすべてのテストの問題) を回避することを試みたいと思っています。どういうわけか「アプリケーション」を別のものに強制できるかどうか、または他の方法でこれを回避できるかどうかについての手がかりを提供できますか?
コードを見ると、可能な他の回避策のシナリオは、所有者 (テストするアプリケーションの「メインフォーム」、つまり取得したいハンドル) を実行中に csReading 状態にすることです。テストでこのフレームを作成しましたが、少なくとも最初は、これを実現するのもそれほど簡単ではないようです。
delphi - (方法) 標準のファイル オープン ダイアログで FutureWindows を使用できますか?
私は tomazy の FutureWindows インフラストラクチャを使用しようとしています ( Delphi GUI Testing and Modal Formsで彼の回答を参照するか、 https://github.com/tomazy/DelphiUtilsのツールのホームを参照してください)、できるかどうか、またその方法を知りたいです。標準の Windows ファイルを開くダイアログで使用できますか? それらは、FutureWindows インフラストラクチャが想定しているように見える TControl から継承していないようです (私が誤解していない限り)。
私がやりたいことは、基本的に、テスト内のコマンドによってモーダルに開かれる OpenFileDialog でファイルを選択することですが、これを行う方法をまだ理解できていません。
delphi - Delphi での単体テスト用の HTTP サーバー
Delphi アプリでいくつかの HTTP コンポーネントをテストする必要があります。私は DUnit を使用しており、テストに自動化を追加したいと考えています。
したがって、私のテスト コードでは、ローカル HTTP サーバーを起動して構成し (たとえば、3 秒で接続を切断する準備をする、低帯域幅をシミュレートする、ログイン/パスワードを要求するなど)、単体テストを実行して HTTP を閉じる必要があります。サーバ。
Delphi/DUnit に正確に使用できる HTTP サーバーはありますか?
Mozilla チームがそのようなサーバーを持っていることは知っていますが、それを DUnit に統合するのは簡単ではありません。
delphi - TIdHTTPServer は、DUnit テストでアクティブ化すると EThread エラー 6 を発生させます
単体テスト用にローカル HTTP サーバーが必要です。
で TIdHTTPServer をアクティブ化しようとするとSetUp、次の EThread メッセージで失敗します。
「スレッド エラー: 記述子が無効です (6)」
これは私がそれを初期化する方法です:
DUnit フレームワークで Indy の TIdHTTPServer を使用する場合、いくつかの制限があるのではないでしょうか?
- デルファイ 2010
- インディ10
procのこの行の後のどこかで例外がスローされましたTIdListenerThread.Run(IdCustomTCPServer ユニット)
しかし、それを深く追跡することはできません。理由はわかりません。
delphi - TeamCity で実行すると、モーダル ウィンドウを閉じる DUnit GUI テストがハングする
@tomazy によるメッセージ ループ タイマー システムを介したモーダル ウィンドウとの対話を含む、DUnit を使用した GUI テストを試みています (詳細については、以前の質問を参照してください: (How) Can I use FutureWindows with standard file open dialogs? )。
テストを手動で実行すると、他の質問の私のソリューションは正常に機能しますが、TeamCity の継続的なビルド システム内でこれを実行すると、ダイアログの OK メッセージを処理する必要があるときにハングします。テストを実行するサービスには「デスクトップと対話する」権限が設定されており、OK が押された場合 (CDN_FILEOK 通知が発生した場合) にのみハングが発生することを確認しました。WM_CLOSE を使用してダイアログを閉じることはできますが、当然、ダイアログが OK モーダル結果を返さないため、使用できません。
これを機能させることができない場合は、おそらく本番コード (テストのターゲット) を変更してイベントを発行し、ファイル名を指定してテストをフックし、ダイアログなしで指定する必要がありますが、私は'この問題の原因を知りたいのですが、できればもちろん製品コードを変更せずに解決してください。