单元测试用例该如何设计
最近一些大公司在进行去测试化的操作,这一切的根源大概可以从几年前微软一刀切砍掉所有内部正式的测试人员开始说起,当时微软内部的测试工程师有一部分转职成了开发工程师,他们的职能中有很大一部分的职责是教会普通开发人员如何进行测试。我们都知道开发人员进行的测试一般以单元测试为主,假如有一天你所在的组织需要你转变成一名测试方面的教练,除了自动化测试之外还需要去推广单元测试,那么你该如何去定义单元测试用例的设计方法论呢?这里给大家一些思路,看看简单的单元测试用例究竟该如何设计。
一个方法可以有任意数量的有效测试用例;它最终取决于方法的结构。有两种简单的方式可以帮助我们设计单元测试用例。
- 参数方法
- 执行路径方法
我将通过提供真实的代码来进行演示。所有代码片段都将用 C# 编写,断言将使用我最喜欢的单元测试包 Fluent Assertions。
我们将为以下方法提供测试用例:
public static bool ContainsNamelessItems(this List<Item> items)
{
return items.Any(item => item.Name.IsNullOrEmpty())
}
此方法将项目集合作为参数。它遍历项目列表,并针对每个项目Item
检查其 name 属性是否为空。如果 name 存在且不为空,我们返回True
,否则我们返回False
。
使用参数方法创建测试用例
这种方式主要考虑的是入参可以传递哪些值。
查看该方法的参数 ContainsNamelessItems,我们有一个 List
- items 是空的
- items 至少包含 1 个 Item 具有 Name 未定义的属性
- items 不包含具有未定义 Name 属性的项目
- items 是 null
这些可能的值中的每一个都可以作为单独的用例存在。
以下是一些可能的测试用例和断言:
1,当List<Item>
为空时,我们期望返回值是False
因为其的List<Item>
无 name 属性。
public void WhenItemsIsEmpty_ReturnFalse()
{
var items = new List<Item>();
var result = items.ContainsNamelessItems();
result.Should()
.BeFalse("because an empty collection cannot contain nameless items");
}
2,当List<Item>
包含至少 1 项没有 name 属性的Item
时,我们期望返回值是True
public void WhenItemsContainsANamelessItem_ReturnTrue()
{
var items = new List<Item>
{
{ new Item { Name = "Item1" },
{ new Item { Name = string.Empty } // nameless item
};
var result = items.ContainsNamelessItems();
result.Should()
.BeTrue("because there is a nameless item in the collection");
}
3,当List<Item>
不包含任何没有 name 属性的项目时,我们期望返回值是False
,因为所有项目都有 name。