第五节:测试指导Right-BICEP
准确的测试会使得我们能及时发现不容易挖掘的Bug,下面列出6个值得测试的部位,提高我们的测试技巧
我们把这6方面统称为Right-BICEP
Right--结果是否正确
B------是否所有的边界条件都是正确的
I-------能查一下反向关联吗
C------能否用其他手段交叉检查一下结果吗
E------你是否可以强制错误发生
P------是否满足性能需求
5.1 结果是否正确
对于有一个大量数据的测试,我们会考虑用一个独立的数据文件来存储这些测试数据,然后让单元测试读取该文件
从一个文件中读取测试数据
using System;
using System.IO;
using System.Collections;
using NUnit.Framework;
namespace WebApplication7
{
[TestFixture]
public class TextLargestDatatfile
{
/*运行testdata.txt中的所有测试数据,(并没有测试异常的情况)
*如果有任何文件IO发生错误,我们将会获得一个错误
*/
[Test]
public void TestFromFile()
{
string line;
StreamReader str = new StreamReader(@"C:\Users\Administrator\Documents\visual studio 2010\Projects\WebApplication7\WebApplication7\testdata.txt");
while ((line = str.ReadLine()) != null)
{
if (line.StartsWith("#"))
{
continue;//忽略注释
}
string[] takes = line.Split(null);
//读取期望值
string val = takes[0];
int exptected = Int32.Parse(val);
//添加Largest函数的参数
ArrayList argument_list = new ArrayList();
for (int i = 1; i < takes.Length; i++)
{
argument_list.Add(Int32.Parse(takes[i]));
}
//转化为原生数组
int[] args=(int[])argument_list.ToArray(typeof(int));
//运行断言
Assert.AreEqual(exptected,cmp.Largestnum(args));
}
}
}
/// <summary>
/// 传递一个int数组 返回最大值
/// </summary>
public class cmp
{
public static int Largestnum(int[] list)
{
int max=0;
for (int i = 0; i < list.Length; i++)
{
if (list[i] > max)
{
max = list[i];
}
}
return max;
}
}
}
testdata.txt代码
# # Simple tests: # 9 7 8 9 9 9 8 7 9 9 8 9 # #Mixture # 7 -9 -7 -8 7 -6 4 9 -1 0 9 -7 4 # #Boundary conditions # 1 1 0 0 2147483647 2147483647 -2147483648 -2147483648
如果和上面的例子一样有很少的东西要测,也许就不值得废那么大的劲了,但是假如我们面对的是一个很负责的程序,数据有几千个,那么测试文件就是一个很好的选择了。
对于验证被测方法是正确的这件事情,如果某些做法使得他变得更加的容易,那么就采纳他吧
5.2 边界条件
是否所有的边界条件都是正确的
在前面求最大值的例子中,我们发现了几个边界条件,最大值位于数组末尾,数组包含负数,或者数组为空等等。
找边界条件是单元测试中最有价值的条件之一,一般bug就出现在边界上。
5.3 检查反向关联
对于一些方法,我们可以用反向的逻辑来验证他们,例如你可以用对结果进行平方的方式来检查一个计算平方根的函数,然后测试结果和原数据是否相近。
5.4 使用其他手法来进行交叉检查
一般计算一个量有好多算法,我们可以在产品代码中和测试代码中使用不同的算法来得值比较
[Test]
public void SquareRootUsingStd()
{
double number = 3880900.0;
double root1 = MyMath.SquareRoot(number);//自定义的方法
double root2 = Math.Sqrt(number);//自带的函数
Assert.AreEqual(root1, root2,0.0001);
}
5.5 强制产生错误条件
当许多错误使得程序崩溃的时候,你应当通过强制来引发错误,来测试代码是如何处理这些问题的。
5.6性能特性
P------是否满足性能需求
很多时候我们发布的第一个版本正常,第二个版本不知道为什么变得很慢,为了避免这个场景,你可以考虑实现一些粗糙的测试来确保性能曲线能够保持稳定,
假如我们编写了一个过滤器,她能够鉴别希望阻止的Web站点。
代码在少量站点都正常,但是在10000以上个呢?
…………