PEX-.NET自动化白盒测试工具的介绍(1)

PEX的全称是(Program EXploration),是一款在.NET下可应用的自动化白盒测试工具,来自于微软研究院。PEX通过分析代码来自动生成测试用例。对于程序里面的每一行代码,PEX都会尽可能地生成合适的输入值来达到提高覆盖率的目标。同时PEX还会分析代码中的分支,生成覆盖更多分支的测试代码(输入数据);PEX在执行代码的同时会监控和分析代码的控制流和数据流,了解程序的行为。每运行完单一个测试以后,PEX会选择一条在前面的测试中没有覆盖到的路径,并且尝试执行它。这一切都是约束求解算法来实现的,官方文档中提到的是一个叫Z3的约束求解器。因为PEX了解被测代码内部结构和行为,所以它不是一个简单地输入随机参数的黑盒测试工具。PEX不会尝试枚举所有可能的输入,事实上也不可能枚举完所有的可能输入。

下面来看看如何利用PEX来帮助提高软件的质量吧。

1. 首先,安装PEX。PEX现在有2个Flavor,支持2个版本的Visual Studio,分别是VSTS2010和VSTS2008,这两个版本的PEX在功能上没有区别,只是在许可证上有区别。本文是以VSTS2008版本作为示例。

2. 建立一个C#的Class Library项目

create a class project
create a class project

3. 新建一个类,并且添加一个静态方法。这个方法是把输入的字符串格式化为首字母大写的格式

public static string Capitalize(string value)
{
	var sb = new StringBuilder();
	bool word = false; // are we writing a word
	foreach (var c in value)
	{
		if (char.IsLetter(c))
		{
			if (!word)
			{
				sb.Append(char.ToUpper(c));
				word = true;
			}
			else
				sb.Append(c);
		}
		else
		{
			if (char.IsPunctuation(c))
				sb.Append('_');
			word = false;
		}
	}
	return sb.ToString();
}

4. 这时候,可以创建一个传统的单元测试,但有了PEX,我们希望用PEX

5. 在该静态方法体内,点击右键,选择“Run Pex Explorations”,就可以运行PEX

6. PEX会编译这个类,并且运行这个方法,监控测试的运行,对于这个简单的方法,很快就会获得结果。在标题栏可以看到,运行了123次测试,其中有1个测试是失败的;失败的用例就是图中被圈出来的那一条。

7. 点击选中测试结果中有异常的测试行,会看到以下菜单,可以做以下操作:

(1)保存该测试为普通的单元测试
(2)自动添加代码来避免该错误的发生
(3)允许此异常在程序中出现
(4)把所有信息发送到文本或者剪切板,这里所有信息包括Detail和Stack trace,如果TFS里面配置了Work Item,还能直接发送到相应的Work Item中

8. 现在我们让PEX帮我们修正一个错。选择Add Precondition,会看到如下菜单。上半部分告诉用户,PEX会做那些操作,下半部分就是选中操作的具体内容,这里就是加上一段对输入是否为空的判断

9. 点击Apply就能把这段代码段加到我们的代码中

public static string Capitalize(string value)
{
	//

	if (value == (string)null)
		throw new ArgumentNullException("value");
	//
	var sb = new StringBuilder();
	bool word = false; // are we writing a word
	foreach (var c in value)
	{
		if (char.IsLetter(c))
		{
			if (!word)
			{
				sb.Append(char.ToUpper(c));
				word = true;
			}
			else
				sb.Append(c);
		}
		else
		{
			if (char.IsPunctuation(c))
				sb.Append('_');
			word = false;
		}
	}
	return sb.ToString();
}

OK!PEX帮助我们找到一个Bug并且修复了它。

本文对PEX进行一个简单的介绍,当然PEX不仅仅是那么简单,还有很多丰富的内容,例如Parameterized Unit Test,Code Contracts等等,后面打算深入研究一下PEX,挖掘一下相关的功能。预告一下,下一篇会介绍如果利用PEX写参数化单元测试(Parameterized Unit Test)

更多的参考:

Pex官方网站

Pex在MSDN上的论坛

主要参考文档:Code Digger Tutorial

1 thought on “PEX-.NET自动化白盒测试工具的介绍(1)”

Leave a Reply

Your email address will not be published. Required fields are marked *