实际的测试用例并不只一两个,根据单元测试策略,可以使用等价类、边界值等测试用例分类法进行划分。
仍以比较list列表中最大整数值为例,我们可以对测试数据进行如下等价类划分:
第一类:数可以是整数、小数。在本例中,如果list列表若含有小数应该报错并人为抛出异常。
第二类:数可以分为正、负、零。
第三类:数可以分为一位数、两位数、三位数……
第四类:list列表中可以有重复的值,重复值不应该影响最大数的判定
第五类:list列表中的值顺序不应该影响最大数的判定
第六类:list列表中可能不含任何整数,即为空。
测试数据必须讨论边界值,因为实践证明边界处是bug的多发地
第一类:数为0,-1,1,Int.MaxValue-1,Int.MinValue+1
第二类:list列表中有零个数、一个数
根据上述分析,我们可以得到许多测试用例,下面选取其中几个对LargestNumber.cs测试。
using System; using System.Collections.Generic; using System.Text; using NUnit.Framework; namespace CompareMaxNumber { [TestFixture] class TestLargestNumber { [Test] public void TestLargestSequense() { Assert.AreEqual(9,LargestNumber.MaxNumber(new int[] {8, 7, 9})); Assert.AreEqual(9, LargestNumber.MaxNumber(new int[] { 7, 8, 9 })); Assert.AreEqual(9, LargestNumber.MaxNumber(new int[] { 9, 8, 7 })); } [Test] public void TestLargestnegative() { Assert.AreEqual(-7, LargestNumber.MaxNumber(new int[] { -9, -7, -8 })); } [Test,ExpectedException(typeof(ArgumentException))] public void TestLargestSmallNumber() { Assert.AreEqual(1, LargestNumber.MaxNumber(new int[] { 1 })); LargestNumber.MaxNumber(new int[] { }); Assert.AreEqual(0, LargestNumber.MaxNumber(new int[] { 0 })); } [Test] public void TestLargestRepetition() { Assert.AreEqual(9, LargestNumber.MaxNumber(new int[] { 9, 3, 5, 9 })); } } }
启动调试,点击run得到的测试结果如下:
测试没有通过!这是因为程序没有对list列表为空作判断。当list.Length为0时,应该抛出异常。我们在LargestNumber.cs中加上如下代码,再次运行nunit.exe,测试通过。
if (list.Length == 0) { throw new ArgumentException("Empty list"); }