失败是尝试的第一步
测试驱动开发的官方指导遵循red-green-refactor周期:
- 编写一个失败的测试。
- 让它通过。
- 重构。
但是从一个失败的测试开始有什么意义呢?以确保您已经编写了正确的测试!我最近遇到的一些意想不到的行为突出了这一点。
假设你有一个图书馆,聚集项目.一个项可以是书或者一个电影,但不能同时进行。如果我们创建一个图书馆在“book模式”中,它最初应该包含一个空书.如果我们在“胶片模式”下创建它,它最初应该包含一个空的电影.让我们先写一个测试来捕获book模式行为:
classdeftLibrary < matlab.unittest.TestCase方法(测试)函数bookModeInitialisesToEmptyBook(testCase) lib =库(模式=“书”);testCase.verifyEqual (lib.Items Book.empty (1,0))结束结束结束
(名称=值名称-值对的语法为介绍了R2021a.它可以和经典款互换(…,“名字”,值)语法)。
让我们进行测试。我们期望它失败是因为图书馆不存在。
我们将跳过创建空类定义的步骤,以及由于缺少带有输入参数和public的构造函数而导致的后续测试失败项目属性,并迭代地将它们添加进来。
的实现图书馆这样我们的测试就通过了:
classdef图书馆属性条目(1,:)条目= Book.empty结束方法函数自由=库(一步法)参数一步法。模式(1,1)字符串{mustBeMember(nvp。模式,“书”“电影”)}=“书”结束结束结束结束
我们运行测试并看到它通过:
到目前为止,一切顺利。现在我们编写一个捕获胶片模式的测试:
函数filmModeInitialisesToEmptyFilm(testCase) lib =库(模式=“电影”);testCase.verifyEqual (lib.Items Film.empty (1,0))结束
我们运行测试:
和……它! ?
为什么它会过去?我们可以使用调试器进行检查自由。项目手动,看看它是空的书而不是空空的电影.经过一番调查,我们发现verifyEqual依赖于isequal而且isequal认为不同类的两个空在某些情况下相等。
无论这种行为是否isequal是正确的,对我们来说重要的一点是我们写错了测试!我们的实现可能是错误的,我们不知道。我们会达到完全报道但是我们的测试不会提供有用的信息。
因此,我们需要重写我们的测试来捕捉这个问题:
函数filmModeInitialisesToEmptyFilm(testCase) lib =库(模式=“电影”);testCase.verifyEmpty (lib.Items) testCase.verifyClass (lib.Items ?电影)结束
让我们运行更新后的测试:
测试现在失败了,我们可以继续我们的实现,相信只有当我们的实现是正确的,我们的测试才会通过。
- 类别:
- 测试
评论
如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。