开发区域

MATLAB高级软件开发

失败是尝试的第一步

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

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

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

想象一下你有一个图书馆,聚集项目.一个可以是或者一个电影,但不能同时兼顾。如果我们创建一个图书馆在“book模式”中,它最初应该包含一个空.如果我们在“电影模式”中创建它,它最初应该包含一个空电影.让我们首先编写一个测试来捕获图书模式行为:

classdeftLibrary < matlab.unittest.TestCase方法(测试)函数bookModeInitialisesToEmptyBook(testCase) lib = Library(模式=“书”);testCase.verifyEqual (lib.Items Book.empty (1,0))结束结束结束

(名称=值名称-值对的语法是在R2021a中引入.它可以和经典的互换(…,“名字”,值)语法)。

让我们运行测试。我们预期它会失败,因为图书馆不存在。

我们将跳过创建空白类定义的步骤,以及由于缺少带有输入参数和public的构造函数而导致的后续测试失败项目属性,并迭代地将它们添加进来。

相反,让我们跳到的实现图书馆这样我们的测试就通过了:

classdef图书馆属性Item (1,:) Item = Book.empty结束方法函数lib = Library(nvp)参数一步法。模式(1,1)字符串{mustBeMember(nvp. member)Mode,["book" "film"])} =“书”结束结束结束结束

我们运行测试并查看它是否通过:

到目前为止,一切顺利。现在我们编写一个捕获胶片模式的测试:

函数filmModeInitialisesToEmptyFilm(testCase) lib = Library(模式=“电影”);testCase.verifyEqual (lib.Items Film.empty (1,0))结束

我们运行测试:

然后……它就过去了!?

为什么会过去?我们可以使用调试器进行检查自由。项目手动,看到它是空的而不是空的电影.经过一番调查,我们发现verifyEqual依赖于isequal而且isequal认为不同类的两个空在某些情况下是相等的。

是否这种行为isequal是正确的,对我们来说重要的一点是我们写错了测试!我们的实现可能是错误的,我们不知道。我们本可以完全做到报道但是我们的测试并不能提供有用的信息。

因此,我们需要重写我们的测试来捕捉这个问题:

函数filmModeInitialisesToEmptyFilm(testCase) lib = Library(模式=“电影”);testCase.verifyEmpty (lib.Items) testCase.verifyClass (lib.Items ?电影)结束

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

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




由MATLAB®R2022a发布

|
  • 打印
  • 发送电子邮件

评论

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