0

ヌニットを使用しています。テストが実行される前に、すべてのテストのすべてのテスト テスト データをロードします。データをロードする他の効果的な方法があるかどうかを知りたいです。以下に使用するコードを投稿しました。データ ソースは xml です。

    private IEnumerable Example
{
    get { return GetExample; }
}
private IEnumerable GetExample()
{
    var doc = XDocument.Load("Example.xml");
    return
        from Examples in doc.Descendants("Example")
        let Example1 = Examples.Attribute("Example1").Value
        let Example2 = Examples.Attribute("Example2").Value
        let Example3 = Examples.Attribute("Example3").Value

        select new object[] { Example1, Example2, Example3};
}
[TestCaseSource("Example")]
public void ShouldLogin(string username, string password, bool expected)
{
    // just test that uses the data from above 
}
<?xml version="1.0" encoding="utf-8" ?>
<Examples>
  <Example Example1="fsse" Example2="dj7sihfs" Example3="true" />
  <Example Example1="hgtd" Example2="sd122?=s" Example3="true" />
  <Example Example1="asde" Example2="!!sf3mff" Example3="true" />
  <Example Example1="bsfd" Example2="--sdfj+?" Example3="true" />
  <Example Example1="aefb" Example2="!#¤%/(sd" Example3="true" />

</Examples>

2 つの異なるテストが同じテスト データを呼び出すと、同じデータが 2 回読み込まれます。

4

1 に答える 1

0

それは設計によるものだと思います。NUnit は、テストの前に環境をクリーンアップし、実行順序に依存しないテストに対して同じ条件を生成するように設計されています。

テスト A が XDocument を変更する場合、テスト B はその変更で実行されます。それは不確定なテスト結果につながる可能性があります。

テスト B がテスト A からの変更を期待している場合、テストは完全に分離されていません。これは悪い習慣です。

その動作を変更したくない場合は、遅延フィールドを実装し、最初のアクセス時にのみテスト データをロードします。どのテストでもデータを変更していないことがわかっている場合は、パフォーマンスを向上させることができますが、注意が必要です。

private static Lazy<IEnumerable> testData = new Lazy<IEnumerable>(GetExample); 

private static IEnumerable GetExample() {
    var doc = XDocument.Load("Example.xml");
    return
        from Examples in doc.Descendants("Example")
        let Example1 = Examples.Attribute("Example1").Value
        let Example2 = Examples.Attribute("Example2").Value
        let Example3 = Examples.Attribute("Example3").Value

        select new object[] { username, password, expected };
}

TestFixtureSetupAttribute を使用することもできます

private IEnumerable testData; 

[TestFixtureSetUp]
public void LoadTestData() {
    testData = GetExample();
}
于 2013-07-17T16:33:21.810 に答える