第五节:测试指导Right-BICEP

准确的测试会使得我们能及时发现不容易挖掘的Bug,下面列出6个值得测试的部位,提高我们的测试技巧

我们把这6方面统称为Right-BICEP

  Right--结果是否正确

  B------是否所有的边界条件都是正确的

  I-------能查一下反向关联吗

  C------能否用其他手段交叉检查一下结果吗

  E------你是否可以强制错误发生

  P------是否满足性能需求

 5.1 结果是否正确

    对于有一个大量数据的测试,我们会考虑用一个独立的数据文件来存储这些测试数据,然后让单元测试读取该文件

从一个文件中读取测试数据

View Code
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 使用其他手法来进行交叉检查 

一般计算一个量有好多算法,我们可以在产品代码中和测试代码中使用不同的算法来得值比较

View Code
 [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以上个呢?

…………

 

posted @ 2012-02-20 16:40  Jimmy-Lee  阅读(377)  评论(0编辑  收藏  举报