2

まず、F# でのテスト セットアップを示します (NUnit の上に FsUnit を使用)。

type SimpleRecord = { A: int; B: int } 
                    override x.ToString() = x.A.ToString()

[<TestFixture>]
type ``Simple Test Cases``() =     
    static member SimpleDataSource =
        [|
            [|{ A = 1; B = 2} ,3|]
        |]

    [<TestCaseSource("SimpleDataSource")>]
    member x.``SimpleTest`` (testData: SimpleRecord * int) =
        let data, expected = testData
        data.A + data.B
        |> should equal expected

このテストは実行され、期待どおりに合格します。ただし、ToStringオーバーライドを変更して呼び出しを含めるとGuid.ToString()、テストが実行されなくなります。

type SimpleRecord = { A: int; B: int } 
                    override x.ToString() = x.A.ToString() + Guid.NewGuid().ToString()

上記の変更により、テストは引き続きテスト エクスプローラーに表示されますが、実行されません。それを右クリックして [選択したテストを実行] を選択しても、テストは実行されません。ビルド エラーは報告されません。

DateTime.ToString()の代わりにを使用して実験しましGuid.ToString()たが、それも実行を拒否します:

type SimpleRecord = { A: int; B: int } 
                    override x.ToString() = x.A.ToString() + DateTime.Now.ToString()

テスト対象の型のオーバーライド内でGuid.ToString()orを呼び出すと、テストが実行されないのはなぜですか?DateTime.ToString()ToString

4

1 に答える 1

2

チャーリー・プールは、根本的な原因について次のように説明しています。

NUnit コンソールまたは GUI ランナーを使用してテストを実行すると、最初にロード (検出) されてから実行されます。アダプターの下で実行する場合、テストは検出フェーズで 1 回、実行フェーズの開始時に 2 回ロードされます。これは、VS テスト ウィンドウの動作の結果です。検出と実行は、VS によって作成された個別のプロセスで実行されます。

ほとんどの場合、これは問題を引き起こしません。テストは 2 回読み込まれます。つまり、テスト データを作成するためのコードが 2 回実行されます。通常、両方とも同じデータが生成されます。

ただし、ランダム データを使用すると、フェーズごとに異なるデータが生成されることがわかっています。最初の検出で表示されるテストは、「不明な」テストの実行中に消えてしまうようです。

あなたの場合、guid は 2 回生成されます。最初のものはテストの名前の一部として使用されるため、そのテストは実行フェーズで消えます。

回避策を示す例を次に示します。

type ProblemRecord = { A: int; B: int } 
                     override x.ToString() = Guid.NewGuid().ToString()

[<TestFixture>]
type ``Test Cases``() =     
    // Using TestCaseData and explicitly setting a name will resolve the problem
    member x.SolutionDataSource =
        [
            TestCaseData(({ A = 1; B = 2} : ProblemRecord), 3)
                .SetName("Workaround")
        ]

    // This test case will be run by Test Explorer
    [<TestCaseSource("SolutionDataSource")>]
    member x.``SolutionTest`` (data: ProblemRecord, expected: int) =
        data.A + data.B
        |> should equal expected
于 2015-08-15T17:09:25.573 に答える