1

「プロジェクト マネージャー」が、テストするプロジェクト (ほぼ最終製品) をくれて困っています。

最後の部分をコーディングしたのは、Silverlight での大きなプロジェクトです。

ここには、(テストに対して) 多くの問題があり、データベース接続 (データ層、サービス、セッション ストレージなど) が別のプロジェクト (ソース コードにアクセスできない) からの閉じられた dll にあり、これらの dll には次のものが含まれています。次のようなコレクション クラス:

public class SomeCollection
{
    public static SomeCollection GetCollectionByName(string name);
}

また、スレッドの制御、エラーの確認、データ読み込みの終了/完了などに使用される別のユーティリティ クラスがあります。

public static class BasicUtilities
{
    public static T ExecuteAndFinish(this T baseclass, Action<T> loaded);

    public static T ExecuteAndFinish(this T baseclass, Action<T> loaded, Action<bool> errors);
}

次に、データをロードしてある種のコントロールなどに入力する必要がある ViewModel で、一般的な呼び出しは次のようになります。

public class SomeViewModel : ViewModelBase
{
    ...
    SomeCollection.GetCollectionByName("AIdentifier").ExecuteAndFinish
    (collectionLoaded) =>
    {
            //do something with the collection, populate a control, grid, listbox, etc
    });
    ...
}

次に、私がテストの初心者であることを「明確に」して、SomeViewModel をテストしたいと思います。moq (特別なモデル、UtilyClass、DataProviders などをモックするため) または Ninject (DI のため、私はそれについてあまり知りません) の 2 つのフレームワークを使用できます。

テスト用に SomeViewModel のコンストラクターをオーバーロードして、使用される一般的な呼び出しを置き換える SomeCollection 型の新しい Virtual プロパティにモック オブジェクトを渡す方法があります。

public class SomeViewModel : ViewModelBase
{
    ...

    SomeCollectionProperty.GetCollectionByName("AIdentifier").ExecuteAndFinish
    (collectionLoaded) =>
    {
            //do something with the collection, populate a control, grid, listbox, etc
    });

    ...
    public virtual SomeClass SomeCollectionProperty { get; set; }
    ...
}

クラス SomeCollection の静的メソッド GetCollectionByName をモックできないため、それは機能しません。さらに悪いことに、その dll を変更することもできません。

DIでは、このようなことが起こるようで、うまくいかないでしょう。わかりません。

どこでもコードを強制的に変更する必要があるようですが、datalayer.dll (グループ化) を変更することはできません。

私がしなければならないことは何ですか?どうもありがとう。

4

2 に答える 2

1

以下を非回答と見なさないでください。「単体テスト」ではなく「テスト」について尋ねました。

単体テストとは、個々のピースを個別にテストすることを意味します。その主な利点は、問題のコードをすばやく特定できることです。これは、多くのコンパイラ チェックを提供せず、最も基本的なバグを特定するためにテストに依存する JavaScript のようなくだらない言語で役立ちます。単体テストは、「42 行目のエラー」を知らせるコンパイラのようなものです。また、開発中にも優れています。アプリケーションで使用する前にコードをテストします (後でデバッグする必要がないことを確信できます)。その欠点は、壊れやすい (コードの変更は多くのテスト変更を意味する) こと、モックをいじる必要があること、コードを慎重に設計する必要があることです (これでは遅すぎます)。

統合テストは、テストの断片をまとめてテストします。その主な利点は、テストがより徹底されていることです (クラスは単独ではうまく機能しますが、設計が間違っているため、実際に一緒に使用すると壊れます)。欠点は、テストを実行するために、データベース、サーバーなどを含む外部環境全体をセットアップする必要がある場合があることです。しかし、繰り返しになりますが、これにより、すべてが連携して動作することをテストできます。

この時点で、統合テストを作成する必要があると思います。これは、コード カバレッジを犠牲にするという意味ではありません。アプリ内のすべてのコード行が実際に機能する場合、それらのそれぞれにヒットする統合テストをセットアップすることは完全に可能です。

統合テストはさまざまなレベルで存在する可能性があり (最も高いレベルは機能テストであり、アプリを世界とのインターフェイスでテストします)、コードをチャンクに分割し、アプリ全体ではなく各チャンクをテストできます。

于 2012-12-17T08:15:54.963 に答える
0

簡単な答え:Typemock Isolator
を使用する-すべてをモックすることができます(含まれているような閉じたdllのプライベート静的メソッド)が、商用製品です。 GetCollectionByName

簡単ではない答え:SOLID
の原則に従ってアプリケーションを構築し、TDDを実践し、リファクタリングとコードの改善を続けることで、問題は解決します(つまり、そもそもこの問題は発生しません)。 ロジックのユニットは分離されており、Moqを使用すると、インターフェイスに依存するすべてのクラスを簡単にテストできます。 完成間近の(出荷済みの)製品にいくつかのテストを投げることは理想的ではありませんが、できるだけ多くの(良い)テストを追加することで、ある程度の価値を追加できます。 Typemock Isolatorは、実行時にコードを挿入し、実際のロジックを選択した動作に置き換えることで、.Netプロファイラーを使用します。これにより、プライベート、統計、封印されたクラスなどのテストが可能になります。


完全開示:以前はTypemockで働いていましたが、現在はほとんどのプロジェクトでMoqを使用しています(無料なので)。

于 2012-12-17T07:59:49.003 に答える