12

単体テストを整理する私の現在の方法は、次のようになります。

  • 各プロジェクトには、単体テストを含む専用のプロジェクトがあります。プロジェクトBusinessLayerには、BusinessLayer.UnitTestsテスト プロジェクトがあります。
  • テストするクラスごとに、テスト対象のクラスとまったく同じフォルダー構造内およびまったく同じ名前空間に配置されたテスト プロジェクトに個別のテスト クラスがあります。CustomerRepository名前空間のクラスの場合、名前空間BusinessLayer.Repositoriesにテスト クラスCustomerRepositoryTestsがありますBusinessLayerUnitTests.Repositories

各テスト クラス内のメソッドは、単純な命名規則に従いますMethodName_Condition_ExpectedOutcome。したがって、メソッドが定義さCustomerRepositoryTestsれたクラスのテストを含むクラスは、次のようになります。CustomerRepositoryGet

[TestFixture]
public class CustomerRepositoryTests
{
    [Test]
    public void Get_WhenX_ThenRecordIsReturned()
    {
        // ...
    }

    [Test]
    public void Get_WhenY_ThenExceptionIsThrown()
    {
        // ...
    }
}

このアプローチは、コードの一部のテストを非常に簡単に見つけることができるため、非常に役に立ちました。反対側のサイトでは、コードのリファクタリングが非常に難しくなります。

  • 1 つのプロジェクトを複数の小さなプロジェクトに分割する場合は、テスト プロジェクトも分割する必要があります。
  • クラスの名前空間を変更したい場合は、テスト クラスの名前空間 (およびフォルダー構造) も変更することを忘れないでください。
  • メソッドの名前を変更するときは、すべてのテストを実行して、そこでも名前を変更する必要があります。確かに、検索と置換を使用できますが、これはあまり信頼できません。結局、手動で変更を確認する必要があります。

特定のコードのテストをすばやく見つけられると同時に、リファクタリングにより適した、単体テストを整理する巧妙な方法はありますか?

あるいは、おそらく Visual Studio の拡張機能で、「ねえ、これらのテストはそのメソッド用なので、メソッドの名前が変更されたときは、親切にしてテストも変更してください」と言うことができますか? ? 正直なところ、私は自分でそのようなものを書くことを真剣に考えています:)

4

5 に答える 5

4

テストで多くの作業を行った後、(少なくとも私にとっては) これらすべての制限を設けることは、良いことではなく、長期的には多くの問題をもたらすことに気付きました。そのため、「名前」と規則を使用してそれを決定する代わりに、コードの使用を開始しました。各プロジェクトと各クラスには、任意の数のテスト プロジェクトとテスト クラスを含めることができます。すべてのテスト コードは、機能の観点から何がテストされているかに基づいて編成されています (または、どの要件を実装しているか、どのバグを再現しているかなど)。次に、コードの一部のテストを見つけるために、次のようにします。

[TestFixture]
public class MyFunctionalityTests
{
    public IEnumerable<Type> TestedClasses()
    {
        // We can find the tests for a class, because the test cases references in some special method.
        return new []{typeof(SomeTestedType), typeof(OtherTestedType)};
    }

    [Test]
    public void TestRequirement23423432()
    {
        // ... test code.
        this.TestingMethod(someObject.methodBeingTested); //We do something similar for methods if we want to track which methods are being tested (we usually don't)
        // ... 
    }
}

resharper の「使用法」などのツールを使用して、テスト ケースを見つけることができます。それだけでは不十分な場合は、すべてのテスト クラスをロードし、次のようなものを実行することで、リフレクションと LINQ による魔法を行いますallTestClasses.where(testClass => testClass.TestedClasses().FindSomeTestClasses()); 。TearDown を使用することもできます。各メソッド/クラスによってテストされるメソッドに関する情報を収集し、同じことを行います。

于 2012-07-21T01:59:40.743 に答える
1

コードをテストに関連付ける VS 拡張機能については、Visual Studio の Test Impact を参照してください。プロファイラーの下でテストを実行し、IL シーケンス ポイントを単体テストにマップするコンパクトなデータベースを作成します。つまり、コードを変更すると、Visual Studio はどのテストを実行する必要があるかを認識します。

于 2012-07-22T02:16:43.483 に答える
1

コードを移動するときにクラスとテストの場所を同期させる 1 つの方法:

  • コードを一意の名前の一時的な名前空間に移動する
  • テストでその名前空間への参照を検索して、移動する必要があるテストを特定します
  • テストを適切な新しい場所に移動します
  • テストからの一時的な名前空間へのすべての参照が適切な場所に配置されたら、元のコードを目的のターゲットに移動します。

エンド ツー エンド テストまたは動作テストの強みの 1 つは、テストがコードではなく要件ごとにグループ化されるため、テストの場所を対応するコードと同期させるという問題を回避できることです。

于 2012-07-20T19:05:39.757 に答える
0

特定のコードのテストをすばやく見つけることができる単体テストを整理する巧妙な方法はありますか

Resharper には、ファイルまたはコードを検索できるいくつかの優れたショートカットがあります。

あなたがクラス CustomerRepository について言ったように、それらはテストです CustomerRepositoryTests

R# ショートカットは、あなたが見つけたものの入力ボックスを表示します。CRT を入力するだけで、名前で始まるすべてのファイルが最初に大文字 C、次に R、次に T として表示されます。

また、CR* などのワイルドカードによる検索も可能で、ファイル CustomerRepository および CustomerRepositoryTests のリストが表示されます。

于 2012-07-20T18:57:25.397 に答える
0

プロジェクトごとに 1 つの単体テスト プロジェクトが適しています。メガ ユニット テスト プロジェクトを試してみましたが、コンパイル時間が長くなりました。

リファクタリングを支援するには、resharpercode rushなどの製品を使用してください。

于 2012-07-20T18:53:58.120 に答える