单元测试中三种准备Test Fixture的方法比较

首先说一下Test Fixture,我不知道怎么样翻译这个Test Fixture,没能搜到一个翻译的比较合适的。最让我气愤的是某人翻译的一本书中,直接把Test Fixture翻译成为测试夹具,这明显就是什么词霸词典硬翻译出来的,我强烈鄙视这样不负责任的翻译行为。

The test fixture is everything we need to have in place to exercise the SUT

我觉得这是一个对Test Fixture的一个很清晰明了的定义,就是运行被测软件所需要的一切东西,这个“东西”不单只是数据,同时还包括对被测软件的准备,例如实例化某个被测方法所在的类,准备数据库的ConnectionString等。通常来说,有三种方法来准备Test Fixture。

1. 内联方式:这种方式就是直接在测试方法中编写准备Test Fixture的代码。用这种方法的缺点是很容易造成代码的重复,出现很多复制粘贴的代码。同时,如果这个SETUP的过程比较复杂,也会降低测试代码的可读性,可维护性。另外的一个问题就是,这种方法很容易会带来测试数据Hard code的隐患。既然有那么多缺点,这种方法还有什么生命力呢?首先,可能对于初学者来说,这种方法是最简单的;其次,在一些只需要准备简单的Test Fixture的场合中,这种方法还是给编写测试的人提供了便利。
Continue reading “单元测试中三种准备Test Fixture的方法比较”

控制反转有助于提高程序的可测试性

控制反转,英文是Inversion of Control,简称IoC。这个概念在JAVA的Spring框架中比较常见,在.NET的开发中,Ioc或者其的变种依赖注入DI(Dependency Injection)是不太常见的。一般来说,类A要使用类B,类A会在其内部对类B进行控制,比较典型的做法就是在类A中创建一个类B的实例;而控制反转,就是把一个已经创建好的类B实例交给类A去控制。
例子:
Continue reading “控制反转有助于提高程序的可测试性”

.NET平台上的Memcached客户端介绍

早上接到一个任务,需要对Linux服务器的Memcached的update操作进行性能测试,我发现我是一个典型的“手里拿着锤子,就把所有问题都当成钉子”的人。我第一个念头就是,上Memcached的官网找.NET的客户端。最后在Codeplex上找到了一个叫Memcached Providers的客户端程序,很小,218K,里面就3个DLL,一个是Memcached Providers本身的DLL,还有一个是Enyim.Caching,Enyim.Caching也是一个.NET平台上的Memcached客户端,最后就是著名的log4net。

Memcached Providers的配置很方便,首先就是在.NET项目中引用上述提到的3个DLL文件,然后就需要修改项目的配置文件,如果是桌面程序,就修改APP.CONFIG,如果是WEB程序,就修改WEB.CONFIG。
Continue reading “.NET平台上的Memcached客户端介绍”

ASP.NET中配置文件web.config的优先级

web.config是ASP.NET的默认配置文件名,一般来说每个ASP.NET站点的根目录都会有一个web.config,因为在VS里面建立站点的时候会一同生成的。其实在一个站点的不同的目录中可以各自有各自的web.config文件,如果一个站点中的不同的目录都有web.config,那么他们之间的关系是什么?哪个web.config的优先级会高呢?顺序如下:
(1) 如果在当前页面所在目录下存在web.config 文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找。
(2) 如果当前页面所在目录下不存在web.config 文件或者web.config 文件中不存在该结点名,则查找它的上级目录,直到网站的根目录。
Continue reading “ASP.NET中配置文件web.config的优先级”

LINQ查询操作中的类型关系

最近在测试中,想尝试用LINQ来简化一下测试的代码,初步学习了一下LINQ,个人感觉需要认真理解查询操作中的类型关系,在阅读MSDN文档后写下了本文,主要参考MSDN讲述理解查询操作中的类型关系,还有对C# 3.0的一个新的关键字var的理解。

首先有一段LINQ查询表达式的代码

List ret = AccountGateway.AccountLiteProvider.GetOnlineUsers(1, 10000);
var query = from onlineUser in ret
			where (onlineUser.UserId > 1301000200)
			select onlineUser.UserId;
foreach(int iUser in query)
{
	Console.WriteLine(iUser.ToString());
}

Continue reading “LINQ查询操作中的类型关系”

如何把GUID转换为整形INT数值

在前面一篇介绍在测试过程中创建唯一数据的文章中,推荐使用GUID作为生成唯一测试数据的方法,本人在测试过程中碰到一个问题,就是对于电话号码的生成,如何使得生成的数据尽可能地达到不重复。C#库里面有一个类-Random,这个类可以帮助开发者或者测试员生成随机数,但是大家都知道,计算机生成的随机数准确来说是伪随机数。本人曾经做过一个小实验,用当前时间作为随机种子,创建1000个随机数,里面重复值是相当多。

沿用前一篇文章的思想,我想把GUID转换为整数,那么应该怎么做呢?在程序内部,GUID也是可以看作是一个整数形式存在的变量,当要做这样子的转换的时候,需要了解的是转换会带来信息的丢失;就好像把一个long转换为一个int,有时候会有信息的丢失。我们可以容忍这个丢失,因为从实践来看,用GUID转成int,比Random类生成随机数好随机的多。以下是如何把GUID转换为int的一个方法:
Continue reading “如何把GUID转换为整形INT数值”

在C#单元测试中使用HttpContext的简单解决办法

场景:最近在测试一个.NET的Http Module,这个Module是用来做URL重写的。刚开始进展的比较顺利,因为该Module里面的方法参数基本上都是String,后来这个Module进行了一下重构,所有参数都变成了HttpContext了,这就直接导致原来的单元测试都跑不起来了,接着就开始了弄HttpContext了。

1. 采用Visual Studio自带的ASP.NET单元测试

刚开始我看了一下被测试的代码,虽然说用到了HttpContext,但是有很多地方我都可以绕过去的,意思就是这个HttpContext只是名以上需要的一个参数,只要它不是NULL就可以了,并不影响我的测试,所以我采用了ASP.NET Unit Test的办法来获取一个HttpContext,这个方法实现起来是最简单的,但是会有一些问题,后面会提及到。
Continue reading “在C#单元测试中使用HttpContext的简单解决办法”

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

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

用XSD自动生成XML对应的.NET实体类

在做测试的过程中,测试数据会保存到一个XML文件里面,很多时候还是先有测试数据(XML),后面才会去做测试。在C#里面,读取XML的方法有很多,最近用了一下XmlSerializer,感觉非常爽!

自己先编一个XML文件,也就是测试数据:


    Magus
    open5555

      29
      30

      77
      21

Continue reading “用XSD自动生成XML对应的.NET实体类”