摘至 邹欣《构建之法》一书,以作学习之用
概述
一个团队需要一定的流程来管理开发活动,每个工程师在软件生命周期所做的工作也应该有一个流程,这一章会介绍PSP(Personal Software Pro-cess,个人软件开发流程)
单元测试
单元测试的作用:让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证
用VSTS写单元测试
例子:许多应用程序中都会用到“用户”这一类型,用户的标识通常是一个邮件地址。对应的单元测试该怎么写?我们来练习一下。首先创建了一个C#的类库(Class Library),并写了如代码清单2-1所示的代码
代码清单2-1
namespace DemoUser
{
public class User
{
public User(string userEmail)
{
m_email = userEmail;
}
//user email as user id
private string m_email;
}
}
在单元测试中,VSTS自动为你生成了测试的骨架,但是你还是要自己做不少事情,最起码要把那些标注为//TODO的事情给做了(如代码清单2-2所示)。此时,单元测试还在使用Assert.In-conclusive,表明这是一个未经验证的(Inconclu-sive)单元测试
代码清单2-2
/// <summary>
/// A test for User (string)
/// </summary>
[TestMethod()]
public void ConstructorTest()
{
// TODO: Initialize to an appropriate
// value User target = new User(userEmail);
string userEmail = null;
// TODO: Implement code to verify target
Assert.Inconclusive("TODO: Implement code to verify target");
}
简单修改之后,可以得到一个正式的单元测试,如代码清单2-3所示。
代码清单2-3
[TestMethod()]
public void ConstructorTest()
{
string userEmail = "someone@somewhere.com";
User target = new User(userEmail);
Assert.IsTrue(target != null);
}
//我们还可以进一步测试E-mail是否确实保存在User类型中
从上面这个例子可以看到,创建单元测试函数的主要步骤是:
1. 设置数据(一个假想的正确的E-mail地址)
2. 使用被测试类型的功能(用E-mail地址来创建一个User类的实体)
3. 比较实际结果和预期的结果(Assert.IsTrue(target != null);)
现在可以运行单元测试了,同时可以看看代码覆盖报告(Code Coverage Report),代码百分之百地都被覆盖了。当然这时候的代码还有很多情况没有处理。例如,还没有:处理空的字符串,长度为零的字符串,都是空格的串……我们可以很快地复制/粘贴,