.net持续集成测试篇之Nunit参数化测试 (2)

以上方法生成了一个包含两个DateTime值的集合.下面我们看如何使用它

[Test] public void DemoTest([ValueSource(nameof(FirstUnitTest.GetPeople))]DateTime dt1) { DateTime dt2 = default(DateTime); Assert.Greater(dt1, dt2); }

我们使用nameof获取刚才生成的用于提供值的方法,作为ValueSource的参数.

使用nameof而不是使用手写字符串的好处在于nameof可以有智能提示,防止手写出现错误,另外就是如果方法名更改,这里将会抛出了一个错误,静态字符串不会提示错误,如果在运行时找不到这个方法则会抛出运行时错误

用于为ValueSource提供值的方法必须是静态的

以上代码,我们把提供值的方法直接写在测试类里,这并不是一种很好的实践,一种好的做法是把所有的用于提供值的方法放在一个外部的类中.

我们把这个类移动到一个叫作MyValueProvider的类中
代码如下

public class MyValueProvider { public static IEnumerable<DateTime> GetPeople() { yield return DateTime.Now; yield return DateTime.Now.AddDays(2); } }

单元测试方法改成如下:

[Test] public void DemoTest([ValueSource(typeof(MyValueProvider),nameof(MyValueProvider.GetPeople))]DateTime dt1) { DateTime dt2 = default(DateTime); Assert.Greater(dt1, dt2); }

如果把值提供方法不在本类中(当前测试方法所在的类),提供一个Type类型(提供值的方法所在的类的类型)作为第一个参数,方法名作为第二个参数.

上面讲的都是基于参数注解的值提供方法,这里基于方法的注解的值提供方法.当然,它完成的功能基于参数注解的方法也同样能完成.

TestCaseAttribute注解

看以下代码片段

[TestCase(3,4)] public void DemoTest(int x,int y) { var val = Add(x, y); Assert.AreEqual(x + y, val); }

其中用到的Add方法代码如下

int Add(int x, int y) { return x + y; }

TestCase的工作原理是这样的,它提供的值是基于位置的,每一个位置处的值赋值给第一个参数,第二个位置处的值提供给第二个参数...

有了TestCase注解之后,Test注解不再是必要的.

TestCaseSourceAttribute注解

从上ValueSource我们很容易想到可能会有TestCaseSource,实际上也确实是这样的,TestCaseSource功能也同ValueSource一样,用于提供基于计算的结果.

用于提供值的类如下

public class MyValueProvider { public static ArrayList ar = new ArrayList { new int[] {3, 4}, new int[] {5, 9}, new int[] {9, 22} }; }

测试方法如下

[TestCaseSource(typeof(MyValueProvider),nameof(MyValueProvider.ar))] public void DemoTest(int x,int y) { var val = Add(x, y); Assert.AreEqual(x + y, val); }

从这个例子我们可看到,不仅方法可以提供值,属性,普通字段也可以提供值

为TestCaseSource提供值的字段,方法,属性也必须是静态的

TestCase和TestCaseSource都支持多重注解,有几个注解,测试方法就会运行几次.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppwys.html