实验三 单元测试
一、 实验目的
1、 掌握UNnit的安装、基本使用方法;
2、 掌握编写运行在UNnit上测试类的基本知识。
二、 实验要求
1、 对一个类编写相对应的测试类,设计测试用例。 2、 使用UNnit测试进行测试。
三、 实验内容
1、测试1: 被测试类
using System; namespace Test {
public class Calculator {
/// /// 加法///
/// /// /// public int Add(int a,int b) {
return a + b; }
/// /// 减法///
/// /// /// public int Minus(int a, int b) {
return a - b; }
/// /// 乘法///
/// /// ///
public int Multiply(int a, int b) {
return a * b; }
/// /// 除法///
/// /// ///
public int Divide(int a, int b) {
return a / b; } } }
2、测试2:对折半插入排序算法进行测试 void BInsertSort() {
public static int[] sort(int[] number)
{
int tmp;
for (int i = 1; i <= number.Length - 1; i++) {
tmp = number[i]; int low = 0; int high = i - 1; while (low <= high) {
int pos = (low + high) / 2; if (tmp < number[pos]) high = pos - 1; else
low = pos + 1; }
for (int j = i - 1; j > high; j--) number[j + 1] = number[j];
number[high + 1] = tmp; }
return number; } }
四、实验步骤
1、测试1:
(1)、针对Calculator设计相应的测试用例。
加法 减法 乘法 除法 操作数a 4 4 4 4 操作数b 2 2 2 2 期望结果 6 2 8 2 实际结果 6 2 8 2 (2)、建立一个测试类对Calculator进行测试。 a) 单个测试用例的测试类
using JSQ;
using NUnit.Framework; namespace JSQTests {
[TestFixture]
public class calculatortests {
[Test]
public void Add_ReturnResult() {
calculator cal = new calculator(); int a = 4, b = 2;//输入数据 int except = 6;//预期输出结果
int actual = cal.Add(a,b);//实际输出结果
Assert.AreEqual(except, actual);//比较是否一样 } [Test]
public void Sub_ReturnResult() {
calculator cal = new calculator(); int a =4,b=2; int except = 2;
int actual = cal.Sub(a,b);
Assert.AreEqual (except,actual);
} [Test]
public void Mix_ReturnResult() {
calculator cal = new calculator(); int a =4, b = 2; int except = 8;
int actual = cal.Mix(a, b);
Assert.AreEqual(except, actual); } [Test]
public void Div_ReturnResult() {
calculator cal = new calculator(); int a = 4, b = 2; int except = 2;
double actual = cal.Div(a, b); Assert.AreEqual(except, actual); } } }
b) 改进的测试类
using JSQ;
using NUnit.Framework; namespace JSQ.Tests {
[TestFixture]
public class CalculatorTests
{ private int a, b,expected,actual; private Calculator cal; [SetUp]
public void Init() {
a=4; b=2;
cal =new Calculator(); }
[TearDown]
public void Des() {
cal = null; } [Test]
public void TestAdd() {
expected = 6;//预期结果 actual = cal.Add(a, b);
Assert.AreEqual(expected, actual); } [Test]
public void TestMinus() {
expected = 2;//预期结果 actual = cal.Minus(a, b);
Assert.AreEqual(expected, actual); } [Test]
public void TestMultiply() {
expected = 8;//预期结果 actual = cal.Multiply(a, b);
Assert.AreEqual(expected, actual); } [Test]
public void TestDivide() {
expected = 2;//预期结果 actual = cal.Divide(a, b);
Assert.AreEqual(expected, actual); }
[Test,ExpectedException(typeof(DivideByZeroException))]
[Category(\"除数为0测试类\")] public void TestDivide()
{
int except = 0;
actual = cal.Divide(a, 0);
Assert.AreEqual(expected, actual); } } }
改进的测试类用了 [SetUp],[TearDown]两个函数,SetUp和TearDown属性可以在测试之前或之后控制测试的初始化和清理,[SetUp]在每一次运行测试类中的一个测试之前都会执行setup方法,[TearDown]在每一次测试运行结束后,执行一次。把需要用到的变量a,
b,expected,actual 以及Calculator私有类写到同一个公共类中,[SetUp]里写a,b,Calculator的初始值,[TearDown]里就写每个测试函数。这样改进的程序就大大地简化了程序,使程序的理解也更加明了。
(3)、使用UNnit进行测试,分析测试结果。 a) 下图为上面测试类的测试结果
b) 当测试到[Text,Ignore]的测试类时,它所对应的测试类就会出现代表忽视的黄色。此测试类为忽视测试类,意思就是在UNnit里测试的时候,这个测试下的测试项为自动忽视项,也即无效项。
c) 当测试到除数为0的测试用例时,测试结果就会出现error的红色,说明测试有错,除数不能为0。如果写在[Test,ExpectedException(typeof(DivideByZeroException))]下面,当测试用例的除数为0时,也不会出现错误。 2、测试2:
(1)、补充完折半插入排序算法BInsertSort (2)、针对折半查找算法,设计相应的测试用例 待排序的数:45, 25, 5, 17, 19, 12, 9, 30, 100, 4, 50 预期排序结果:4,5,9,12,17,19,25,30,45,50,100 (3)、编写测试类
[TestFixture]
public class SortTests {
private int[] data={ 45, 25, 5, 17, 19, 12, 9, 30, 100, 4, 50 }; [SetUp]
public void Init() { } [Test]
public void TestSort() {
int[] expected={ 4,5,9,12,17,19,25,30,45,50,100}; int[] actual;
actual = Program.sort(data);
Assert.AreEqual(expected, actual); }
}
(4)、使用UNunit进行测试,分析测试结果。
五、实验总结
用UNnit软件进行测试用例,显然省了人工的很多实例的操作,在这个实验中的实际练习中也感受到了UNnit的强大。UNnit的使用最重要的还是写测试类,每个测试类都是用[Text]标志的,也含有一些对与异常情况处理的测试类,像[Text,Ignore]等,他们的使用也很方便。我觉得难点在于SetUp和TearDown的使用,这两个属性可以在测试之前或之后控制测试的初始化和清理,可以把多个相似的测试用例的初始值写到SetUp里,因为在每一次运行测试类中的一个测试之前都会执行setup,这个就大大方便了测试用例书写的繁琐。对于对折半插入法排序的测试,先用写上折半插入法的排序代码,本排序的数据使用的是数组定义的,测试类主要是写上预期的排序结果private int[] data={ 45, 25, 5, 17, 19, 12, 9, 30, 100, 4, 50 }; 和实际的排序结果actual = Program.sort(data);然后两个结果相对比Assert.AreEqual(expected, actual);总体来说,这两个实验都加深了我对测试类写法的理解以及UNnit的使用方法,既巩固了我C#的编程能力,也提高了我对软件测试的兴趣。