Nunit在测试执行之前加载所有测试的所有测试测试数据

时间:2013-07-17 15:54:04

标签: xml c#-4.0 nunit

我正在使用Nunit。它在测试执行之前加载所有测试的所有测试测试数据。我只想知道为什么会发生这种情况。我想如果有任何其他有效的方法来加载数据。我已经发布了我在下面使用的代码,数据源是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>

当两个不同的测试调用相同的测试数据时,它会加载相同的数据两次 感谢您提前提供的帮助

1 个答案:

答案 0 :(得分: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();
}