下面我们继续通过实例来学习。
新建一个MathCompute类,通过这个类我们要实现的是计算一个数组中最大的项。
public class MathCompute { public int Largest(int [] array) { if (array == null || array.Length ==0) { throw new Exception("array参数传入错误!"); } int largestValue = Int32.MinValue; foreach (int arr in array) { if(largestValue < arr) { largestValue = arr; } } return largestValue; } }
新建一个测试类 MathComputeTest
[TestFixture] public class MathComputeTest { }
在这里我们发现测试这样一个方法有很多种情况,
比如:参数数组为0,NULL,数组中全是正数,全是负数,有正数有负数,有重复项,数组长度为零……
这样的话,按照前面的学习我们在这里不是要写很多个测试方法了吗?像这个还好一点情况还不是太多。
如果有N多种情况,写这么多的测试方法都是相似的,每一个测试中我们都要输入不同的数字。
有没有一种简单的方法呢?这里我们的解决方法是将我们要输入的数组写在一个文本文件或者是XML文件中,
让程序来一行行读取,这样如果测试的数值有更改的话,我们只需要把这个文本文件中的值更改一下即可。
这样就可以大大的提高项目测试的效率了吧。
下面我们动手实践吧!
新建一个文本文件(也可以是XML文件)如下:
# 这里是注释
12 2 5 9 8 6 12
-1 -3 -1 -67 -32 -8
23 23 12 5 -9 0
2 2 2 2 2 2 2
1 1
这里的文本文件是按照自己的意思写的,例如上面的文本文件我就自定义了#是注释行,然后一行是一个数组中的项,
其中每一行的第一项我定义为这个数组中期望的最大值,每一行除了第一项的数值全部是要传入的数组中的项目了。
到这里大家就知道接下来应该怎么做了吧。对了,接下来我们在测试类中添加读取此文本文件的方法咯。
运行NUnit,试试吧。[TestFixture] public class MathComputeTest { private MathCompute mc; [TestFixtureSetUp] public void initMath() { mc = new MathCompute(); } [Test] public void testLargest() { //项目生成以后此方法是在项目的BIN目录下面的。所以Dataset.txt的位置如下: StreamReader streamReader = new StreamReader(@"../../DataSet.txt"); string line = null; while ((line = streamReader.ReadLine())!=null) { //如果是以#开头,则此行是自定义的注释行,所有跳过。 if (line.StartsWith("#")) { continue; } string[] takens = line.Split(null); int expectedValue = Int32.Parse(takens[0]); List<int> arrayList = new List<int>(); //每行的第一个数值是期望的最大值,此处从1开始 for (int i = 1; i < takens.Length;i++) { arrayList.Add(Int32.Parse(takens[i])); } int[] array = arrayList.ToArray(); Assert.AreEqual(expectedValue, mc.Largest(array)); } streamReader.Close(); //关闭流,可别忘记咯。 } }
这样是不是简便了许多呢,而且这样的代码我们还可以重用的……