GUIRunnerに基づく

パート1

パート2

パート3



今日、FireMonkey用のGUIRunnerの作成方法についての投稿を追加しました。 ソーシャルネットワークの1つに関する投稿のコメントで、 Alexey Timokhinは、別の有名なテストフレームワークであるDUnitXに注目しました。

コンソールオプションを使用して、別の方法を見つけようとしましたが、Alexanderは受け入れられませんでした。 リポジトリに入ったとき、FireMonkeyの下で完成したGUIRunnerが完全にしおれているのが見えました。



しかし。



最初の起動後、アレクサンダーへの私の最初のメッセージは-「笑。ダニはありません。」 したがって、問題は無駄に解決されませんでした。 さらに慎重に研究した結果、このフォームを書いた人も、オリジナルのGUIRunnerを部分的に「ちらっと見た」という印象を受けました。



一般に、FireMonkeyコーンがまだいっぱいになるまで、1か月前からこのような贈り物に非常に満足しています。 さて、今日は他のプログラマーが同じ問題をどのように解決したのかと思っていました。



多くの間違いをほぼ同じように犯しました。 投稿で、テストとブランチを「リンク」する方法について書きました。最終的に、TDictionaryを使用したリファクタリングの提案になりました。 オリジナルのように、思い出させてください:



l_Test.GUIObject := aNode.Items[l_Index]; ... l_TreeViewItem.Tag := FTests.Add(aTest);
      
      





DUnitX開発者も同じことをしましたが、TTreeViewItemのラッパーを作成しました(将来的に自分に追加します)。



 type TTestNode = class(TTreeViewItem) strict private FFullName: String; FImage: TImage; public constructor Create(Owner: TComponent; Text: String; TestFullName: String); reintroduce; destructor Destroy; override; property FullName: String read FFullName; procedure SetResultType(resultType: TTestResultType); procedure Reload; end;
      
      





そして、各テストをtestという名前のブランチに関連付けました。



 function TGUIXTestRunner.GetNode(FullName: String): TTreeViewItem; var i: Integer; begin Result := nil; i := 0; repeat begin if (TestTree.ItemByGlobalIndex(i) as TTestNode).FullName = FullName then Result := TestTree.ItemByGlobalIndex(i); Inc(i); end until Assigned(Result) or (i >= TestTree.GlobalCount); end;
      
      





別のことは私を驚かせました:



  FFailedTests: TDictionary<String, ITestResult>;
      
      





Stringキーが必要な理由を推測しますか? ブランチにアクセスして、テスト結果の後にその状態を報告するのは正しいことです。 私に関しては、彼らはあまりにもスマートです。



TTreeNodeクラスは特別な言及に値します。 テストへの「リンク」とブランチの状態を変更する画像をそれ自体に保存します。 クラスはTreeViewItemから継承されるため、このようなコードは完全に機能します。



 var testNode : TTreeViewItem; ... testNode := CreateNode(TestTree, test.Name, test.Fixture.FullName + '.' + test.Name); ... function TGUIXTestRunner.CreateNode(Owner: TComponent; Text: String; TestFullName: String): TTreeViewItem; begin Result := TTestNode.Create(Owner, Text, TestFullName); end; ... constructor TTestNode.Create(Owner: TComponent; Text, TestFullName: String); begin inherited Create(Owner); Self.Text := Text; FFullName := TestFullName; FImage := TImage.Create(Owner); FImage.Parent := Self; {$IFDEF DELPHI_XE6_UP} FImage.Align := TAlignLayout.Right; {$ELSE} FImage.Align := TAlignLayout.alRight; {$ENDIF} FImage.Bitmap.Create(15, 15); FImage.Bitmap.Clear(TAlphaColorRec.Gray); FImage.SendToBack; end;
      
      





一般的に、DUnitXは良い印象を与えました。 フレームワークは、彼の兄よりもはるかに堅実に見えます。 連中はインターフェースとアーキテクチャを改訂し、さらに改善したと思います。 すべてのコードは非常にきれいです。 時々コメントが増えます。 よく見て比較します。



参照資料



リポジトリDelphi-Mocks 。 フレームワークをコンパイルするために必要です。

DUnitXリポジトリ。



All Articles