2013-07-17 62 views
0

我正在使用Nunit。它会在测试执行之前加载所有测试的所有测试测试数据。我只想为什么发生这种情况。我想,如果有加载data.I任何其他有效的办法已经公布我在下面使用,数据源是XMLNunit加载所有测试测试执行前的所有测试的测试数据

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> 

它加载相同的数据两次当两个不同的测试要求相同的测试数据时的代码 谢谢你的帮助提前

+0

你不提供*如何*您GetExample被调用。 GetExample位于NUnit文本夹具中的位置定义了它将在多长时间内执行一次。请提供使用此代码的整个文本夹具。 –

回答

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(); 
} 
+0

谢谢你向我解释为什么所有的测试都是在测试执行之前加载的,但是当我使用像你所建议的那样的延迟加载时,我得到一个'System.Reflection.TargetParameterCountException:参数计数不匹配.'错误 –