测试脚本示例
本系列的第二篇文章演示了如何在控制猫门锁闭和解锁的家庭自动化系统(HAS)应用程序中实现确定白天还是夜晚的逻辑。 第三篇文章介绍了如何编写代码以在晚上锁定门并在白天将其解锁的应用程序中使用该逻辑。
提醒一下,请按照此处的说明进行操作 ,以继续使用.NET xUnit.net测试框架。
夜间禁用猫陷阱门
假设猫门是一种复杂的物联网(IoT)产品,具有IP地址,可以通过向其API发送请求来进行访问。 为简洁起见,本系列文章不涉及如何对IoT设备进行编程。 相反,它模拟服务以将精力集中在测试驱动开发(TDD)和变异测试上。
首先编写失败的单元测试:
[ Fact
]
public
void GivenNighttimeDisableTrapDoor
(
)
{
var expected
=
"Cat trap door disabled"
;
var timeOfDay
= dayOrNightUtility
.
GetDayOrNight
( nightHour
)
;
var actual
= catTrapDoor
.
Control
( timeOfDay
)
;
Assert
.
Equal
( expected, actual
)
;
}
这描述了全新的组件或服务( catTrapDoor )。 该组件(或服务)具有在当前时间下控制活板门的功能。 现在是时候实现catTrapDoor了 。
要模拟此服务,您必须首先使用界面描述其功能。 在app文件夹中创建一个新文件,并将其命名为ICatTrapDoor.cs (按照惯例,接口名称以大写字母I开头)。 将以下代码添加到该文件:
namespace app
{
public
interface ICatTrapDoor
{
string Control
(
string dayOrNight
)
;
}
}
该接口无法运行。 它仅描述构建CatTrapDoor服务时的意图。 接口是创建所使用服务的抽象的好方法。 从某种意义上说,您可以将此接口视为CatTrapDoor服务的API。
要实现API,请在app文件夹中创建一个新文件,并将其命名为FakeCatTrapDoor.cs 。 在类文件中输入以下代码:
namespace app
{
public
class FakeCatTrapDoor
: ICatTrapDoor
{
public
string Control
(
string dayOrNight
)
{
string trapDoorStatus
=
"Undetermined"
;
if
( dayOrNight
==
"Nighttime"
)
{
trapDoorStatus
=
"Cat trap door disabled"
;
}
return trapDoorStatus
;
}
}
}
这个新的FakeCatTrapDoor类实现了ICatTrapDoor接口。 其方法Control接受字符串值dayOrNight,并检查传入的值是否为“ Nighttime”。 如果是这样,它将把trapDoorStatus从“ Undetermined”修改为“ Cat trap door Disabled”,并将该值返回给调用客户端。
FakeCatTrapDoor ? 因为它不是真正的猫陷阱门的代表。 伪造品可以帮助您确定处理逻辑。 一旦您的逻辑密闭,虚假服务将替换为真实服务(此主题保留用于集成测试的学科)。实施了所有功能后,所有单元测试都会在运行时通过:
Starting test execution, please wait...
Total tests; 3. Passed: 3. failed: 0. Skipped: 0.
Test Run Successful.
Test execution time: 1.3913 Seconds
白天启用猫陷阱门
现在是时候看看用户故事中的下一个场景:
方案2:在白天启用猫陷阱门
- 鉴于时钟检测到日光
- 时钟通知HAS时
- 然后,HAS启用猫陷阱门
这应该很容易,只是第一种情况的另一面。 首先,编写失败的测试。 将以下单元测试添加到unittest文件夹中的UnitTest1.cs文件中:
[ Fact
]
public
void GivenDaylightEnableTrapDoor
(
)
{
var expected
=
"Cat trap door enabled"
;
var timeOfDay
= dayOrNightUtility
.
GetDayOrNight
( dayHour
)
;
var actual
= catTrapDoor
.
Control
( timeOfDay
)
;
Assert
.
Equal
( expected, actual
)
;
}
将“日光”状态发送到catTrapDoor服务时,您可能会期望收到“启用了猫陷阱门”通知。 运行单元测试时,您会看到预期的结果,该结果将按预期失败:
Starting test execution, please wait...
[Xunit unittest.UnitTest1.UnitTest1.GivenDaylightEnableTrapDoor [FAIL]
Failed unittest.UnitTest1.UnitTest1.GivenDaylightEnableTrapDoor
[...]
单元测试预期会收到“启用了猫陷阱门”通知,但被告知猫陷阱门状态为“未确定”。 凉; 现在是解决此小故障的时候了。
在FakeCatTrapDoor中添加三行代码即可达到目的 :
if
( dayOrNight
==
"Daylight"
)
{
trapDoorStatus
=
"Cat trap door enabled"
;
}
再次运行单元测试,所有测试通过:
Starting test execution, please wait...
Total tests: 4. Passed: 4. Failed: 0. Skipped: 0.
Test Run Successful.
Test execution time: 2.4888 Seconds
太棒了! 一切看起来都不错,所有的单元测试都是绿色的,您拥有坚如磐石的解决方案。 谢谢,TDD!
没那么快!
经验丰富的工程师不会相信该解决方案是坚如磐石。 为什么? 因为解决方案还没有被改变。 要深入了解什么是突变及其为何重要,请务必阅读本系列的最后一篇文章。
翻译自: https://opensource.com/article/19/9/mutation-testing-example-execute-test
测试脚本示例