开发区域

MATLAB的高级软件开发

失败是尝试的第一步

测试驱动开发的官方指导遵循red-green-refactor周期:

  1. 编写一个失败的测试。
  2. 让它通过。
  3. 重构。

但是从一个失败的测试开始有什么意义呢?以确保您已经编写了正确的测试!我最近遇到的一些意想不到的行为突出了这一点。

假设你有一个图书馆,聚集项目.一个可以是或者一个电影,但不能同时进行。如果我们创建一个图书馆在“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 ?电影)结束

让我们运行更新后的测试:

测试现在失败了,我们可以继续我们的实现,相信只有当我们的实现是正确的,我们的测试才会通过。




发布与MATLAB®R2022a

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。