使用预先设计的故障来确保您的代码达到预期的结果并遵循.NETxUnit.net测试框架进行测试。在MutationtestingistheevolutionofTDD中,我谈到了迭代的力量。在可测量的测试中,迭代保证找到问题的解决方案。在那篇文章中,我们讨论了迭代方法来帮助确定计算给定数字的平方根的代码的实现。我还证明了最有效的方法是找到一个可衡量的目标或测试,然后以最佳猜测开始迭代。正如预期的那样,第一次测试通常会失败。因此,失败的代码必须针对可衡量的目标或测试进行改进。根据运行结果,对测试值进行验证或进一步改进。在这个模型中,学习找到解决方案的唯一方法就是反复失败。这听起来违反直觉,但确实有效。在此分析之后,本文探讨了在构建包含某些依赖项的解决方案时使用DevOps的好方法。第一步是编写一个预期结果失败的用例。依赖性的问题是你不能依赖它们。正如MichaelNygard在《没有终结状态的架构》中机智地展示的那样,依赖性问题是一个巨大的话题,最好留给另一篇文章。在这里,您将了解依赖项可能给您的项目带来的一些潜在问题,以及如何通过测试驱动开发(TDD)避免这些陷阱。首先,找到现实生活中的挑战,看看如何使用TDD解决它。谁把猫放出来了?屋顶上的猫在敏捷开发环境中,通过定义期望的结果来开始构建解决方案会很有帮助。通常,期望的结果在用户故事中描述:我想使用我的家庭自动化系统(HAS)来控制猫何时可以外出,因为我想在晚上保护它的安全。现在您有了用户故事,您需要通过提供一些功能需求(即指定验收标准)来详细说明它。从伪代码描述的最简单的场景开始:场景一:晚上关猫门使用时钟监控晚上时间时钟通知HAS系统HAS关闭支持物联网(IoT)的猫门在开始构建之前,您需要分解(分解为依赖项)您正在构建的系统(HAS)。您要做的第一件事是确定任何依赖项(如果幸运的话,您的系统没有依赖项会更容易,但是,这样的系统可以说不是很有用)。从上面的简单场景中,您可以看到所需的业务成果(自动控制猫门)取决于监控夜间情况。这种依赖性取决于时钟。但是时钟不能分辨白天和黑夜。您需要提供此逻辑。正在构建的系统中的另一个依赖项是自动访问猫门并启用或禁用它的能力。这种依赖很可能依赖于猫门提供的具有物联网能力的API。依赖管理面临快速失败为了满足依赖关系,我们将构建逻辑来确定当前时间是白天还是晚上。本着TDD的精神,我们将从一个小失败开始。有关如何设置本练习所需的开发环境和脚手架的详细说明,请参阅我之前的帖子。我们将重用相同的NET环境和xUnit.net框架。接下来,创建一个名为HAS(“家庭自动化系统”)的新项目并创建一个名为UnitTest1.cs的文件。在该文件中,编写第一个失败的单元测试。在此单元测试中,描述您的预期结果。比如系统运行时时间是晚上7点,负责判断是白天还是晚上的组件会返回值Nighttime。下面是描述预期值的单元测试:usingSystem;usingXunit;namespaceunittest{publicclassUnitTest1{[事实]publicvoidGiven7pmReturnNighttime(){varexpected="Nighttime";varactual=dayOrNightUtility。获取日或夜();断言。等于(预期,实际);}}}到目前为止,您可能熟悉单元测试的结构。快速复习:在此示例中,通过为单元测试指定一个描述性名称Given7pmReturnNighttime来描述预期结果。然后,在单元测试的主体中,创建一个名为expected的变量并为其指定预期值(在本例中为Nighttime值)。然后,为实际值指定实际值(在组件或服务处理完一天中的时间后可用)。最后,通过断言期望值和实际值相等来检查是否满足预期结果:Assert.Equal(expected,actual)。您还可以在上面的列表中看到名为dayOrNightUtility的组件或服务。该模块可以接收消息GetDayOrNight并返回一个字符串类型的值。此外,本着TDD的精神,所描述的组件或服务尚未构建(此处描述仅供稍后说明)。构建这些是由所描述的预期结果驱动的。在应用程序文件夹中创建一个新文件并将其命名为DayOrNightUtility.cs。将以下C#代码添加到此文件并保存:返回日或夜;现在转到命令行并更改目录更改为unittests文件夹并运行:[Xunit.net00:00:02.33]unittest.UnitTest1.Given7pmReturnNighttime[FAIL]Failedunittest.UnitTest1.Given7pmReturnNighttime[...]恭喜,您已经完成了第一个失败的单元测试。单元测试的预期结果是DayOrNightUtility方法返回字符串Nighttime,但它返回Undetermined。修复失败的单元测试的一种快速而肮脏的方法是将值Undetermined替换为值Nighttime并保存更改:返回日或夜;}}}现在运行,成功。开始测试执行,请稍等...总测试:1。通过:1。失败:0。跳过:0。测试运行成功。测试执行时间:2.6470秒但是,硬编码该值基本上是作弊,大多数让我们添加一些智能到DayOrNightUtility方法。修改GetDayOrNight方法以包含一些时间计算逻辑:publicstringGetDayOrNight(){stringdayOrNight="Daylight";DateTime时间=newDateTime();if(time.Hour<7){dayOrNight="夜间";}返回dayOrNight;该方法现在从系统获取当前时间并将其与Hour进行比较以查看它是否小于7AM。如果小于,处理逻辑会将dayOrNight字符串值从Daylight转换为Nighttime。现在,单元测试通过了。测试驱动解决方案的开始我们现在已经开始了基本的单元测试和我们的时序依赖性的工作解决方案。后面还有更多的测试用例要执行。在下一篇文章中,我将演示如何测试一天中的时间并在此过程中利用故障。
