实验三单元测试一、实验目的1、掌握UNnit的安装、基本使用方法;2、掌握编写运行在UNnit上测试类的基本知识。
二、实验要求1、对一个类编写相对应的测试类,设计测试用例。
2、使用UNnit测试进行测试。
三、实验内容1、测试1:被测试类using System;namespace Test{public class Calculator{/// <summary>/// 加法/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public int Add(int a,int b){return a + b;}/// <summary>/// 减法/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public int Minus(int a, int b){return a - b;}/// <summary>/// 乘法/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public int Multiply(int a, int b){return a * b;}/// <summary>/// 除法/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>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;elselow = 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设计相应的测试用例。
(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]里就写每个测试函数。
这样改进的程序就大大地简化了程序,使程序的理解也更加明了。
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);}}五、实验总结用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#的编程能力,也提高了我对软件测试的兴趣。