快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

千赢国际qy88.vⅰp+qy88.vip_集报网



本文示例源代码或素材下载

前一章我们简单先容了NUnit的入门示例《一步一步学NUnit(1)》,让大年夜家对NUnit有个简单的熟识。

NUnit的应用是异常简单的,然则它在项目中应用时,有许多最佳实践。这章我们把上一章没有讲到的NUnit的一些设置设置设备摆设摆设和特点先容一下。

要想纯熟地应用NUnit照样要在实践中应用和体会,纯真地进修常识点是没有用的。

好,不再废话了。继承上一章的内容。

在Visual Studio 2008 中打开上一章的示例,Calculator类有4个最简单的措施:加、减、乘、除。CalculatorTest类中的四个措施是Calculator类四个措施的单元测试。

[TestFixture]

public class CalculatorT千赢国际qy88.vⅰp+qy88.vipest

...{

[Test]

public void TestAdd()

...{

Calculator cal = new Calculator();

int expected = 5;

int actual = cal.Add(2, 3);

Assert.AreEqual(expected, actual);

}

[Test]

public void TestMinus()

...{

Calculator cal = new Calculator();

int expected = 5;

int actual = cal.Minus(10, 5);

Assert.AreEqual(expected, actual);

}

[Test]

public void TestMultiply()

...{

Calculator cal = new Calculator();

int expected = 5;

int actual = cal.Multiply(1, 5);

Assert.AreEqual(expected, actual);

}

[Test]

public void TestDivide()

...{

Calculator cal = new Calculator();

int expected = 5;

int actual = cal.Divide(25, 5);

Assert.AreEqual(expected, actual);

}

}

这里必然要留意,TestAdd()、TestMinus()、TestMultiply()和TestDivide()措施没有任何关系,也便是说单元测试中,所有的测试措施都是自力的。各个措施之间没有依附性,删除任何一个单元测试措施,对其它的测试不会有任何影响。

上一章中,我们已经先容了[TestFixture]和[Test],现在我们为这个类新增一个措施。

[SetUp]

public void InitMethod()

{

Console.WriteLine("Initialization method");

}

从新天生项目,再运行NUnit,选中"CalculatorTest"进行单元测试

图片看不清楚?请点击这里查看原图(大年夜图)。

切换到NUnit的"Console.Out"中,我们看到"Initialization method"呈现了4次,假如只选中一个测试措施

图片看不清楚?请点击这里查看原图(大年夜图)。

我们看到,这时只呈现一次的"Initialization method"。[SetUp]的意思便是指在运行每个测试措施前履行它。响应的,有开始一定有停止,[TearDown]是指在每个测试措施停止后运行。

我们再新增一个措施

由于运行每个测试措施之前,都邑运行InitMethod()措施,以是每次都邑初始化使第一个操作数为10,第二个操作数为2。在[SetUp]中初始化了的资本,我们就可以在[TearDown]里销毁开释。

这里大概有人会问,假如我的项目很大年夜,每个测试措施都必要连接数据库,在每个措施履行的时刻进行连接再开释,这样是不是太耗资本太慢了,能不能在一个单元测试类实例化的时刻就运行一个指定的措施呢?

这是可以的。在NUnit中,我们应用[TestFixtureSetUp]和[TestFixtureTearDown]就可以实现这样的功能。[TestFixtureSetUp]是指在这个测试类的全部生命周期中,它在所有的测试措施之前运行一次,而[TestFixtureTearDown]是在所有的测试措施都停止时运行。

这里要留意的,[TestFixtureSetUp]与构造函数是不一样的,它标识的措施迟于构造函数运行。我们再对这个测试类进行重构

[TestFixture]

public class CalculatorTest

...{

private Calculator cal;

private int a, b, expected, actual;

public CalculatorTest()

...{

Console.WriteLine("履行构造函数");

}

[TestFixtureSetUp]

public void InitClass()

...{

Console.WriteLine("履行TestFixtureSetUp");

cal = new Calculator();

a = 10;

b = 2;

}

[TestFixtureTearDown]

public void FinalizeClass()

...{

Console.WriteLine("履行TestFixtureTearDown");

}

[SetUp]

public void InitMethod()

...{

Console.WriteLine("履行SetUp");

}

[TearDown]

public void FinalizeMethod()

...{

Console.WriteLine("履行TearD千赢国际qy88.vⅰp+qy88.vipown");

a = 10;

b = 2;

}

[Test]

public void TestAdd()

...{

Console.WriteLine("TestAdd() Begin");

expected = 12;

actual = cal.Add(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestAdd() End");

}

[Test]

public void TestMinus()

...{

Console.WriteLine("TestMinus() Begin");

expected 千赢国际qy88.vⅰp+qy88.vip= 8;

actual = cal.Minus(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestMinus() End");

}

[Test]

public void TestMultiply()

...{

Console.WriteLine("TestMultiply() Begin");

expected = 20;

actual = cal.Multiply(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestMultiply() End");

}

[Test]

public void TestDivide()

...{

Console.WriteLine("TestDivide() Begin");

expected = 5;

ac千赢国际qy88.vⅰp+qy88.viptual = cal.Divide(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestDivide() End");

}

}

NUnit有一个与[Ignore]类似的属性[Explicit],它是指只有在NUnit中被明确的指准时才运行,否则不运行。有点拗口,我们来看例子。改写TestMinus措施

[Test,Explicit]

public void TestMinus()

{

Console.WriteLine("TestMinus() Begin");

expected = 8;

actual = cal.Minus(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestMinus() End");

}

这里,

[Test,Explicit]

[Test]

[Explicit]

是完全一样的。

我们看它的截图

图片看不清楚?请点击这里查看原图(大年夜图)。

"TestMinus"是灰色的,运行的Cases有2个,一个被轻忽。而当我们选中TestMinus时

图片看不清楚?请点击这里查看原图(大年夜图)。

这个测试运行了。

再给大年夜家先容一个分类属性[Category(string name)],使用这个分类属性,我们可以为每个措施定义种别。

[Test, Ignore("Ignore"), Category("Category A")]

public void TestAdd()千赢国际qy88.vⅰp+qy88.vip

...{

Console.WriteLine("TestAdd() Begin");

expected = 12;

actual = cal.Add(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestAdd() End");

}

[Test, Category("Category B")]

[Explicit]

public void TestMinus()

...{

Console.WriteLine("TestMinus() Begin");

expected = 8;

actual = cal.Minus(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestMinus() End");

}

[Test, Category("Category A")]

public void TestMultiply()

...{

Console.WriteLine("TestMultiply() Begin");

expected = 20;

actual = cal.Multiply(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestMultiply() End");

}

[Test, Category("Category B")]

public void TestDivide()

...{

Console.WriteLine("TestDivide() Begin");

expected = 5;

actual = cal.Divide(a, b);

Assert.AreEqual(expected, actual);

Console.WriteLine("TestDivide() End");

}

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: