为什么测试框架的语法如此奇怪?

时间:2014-11-07 23:56:46

标签: javascript unit-testing syntax tdd bdd

我最近开始调查不同的单元测试解决方案(在JavaScript中,但我想我的问题不是针对特定语言的)。

我想知道的主要问题是为什么语法在试图模仿人类语言时如此奇怪?背后的原因是什么?

例如,来自Chai断言库的示例:

expect(obj).to.have.property('foo');

在我看来,使用该语言的本地方法来表达同样的事情要清楚得多:

assert(typeof obj.foo != 'undefined');

这对我作为开发人员来说更具可读性,因为我已经知道!=typeof的工作方式,并且无需阅读其他一些API文档来调查究竟是什么{{1}意思是。

目前我只有一种印象,即语法可能来自像BDD / TDD这样的最佳实践,并且有一种奇怪的感觉,这种想法在某种程度上接近于超出SQL语法的范围。

在我看来,不是提供一组10个不同的函数来以最优选的语法执行相同的操作,而是拥有一组最小的测试指定函数会更简单,更方便,例如:

  • 测试一个真实的价值;
  • 比较两个数字/字符串/对象,并另外显示差异,如果那些不匹配;
  • 检查值是否超过限制;
  • ...

我是否错过了重要的事情?是否暗示测试应该由产品所有者部分创建/评估,产品所有者可能不是程序员?语法只是编写测试的某种传统吗?

2 个答案:

答案 0 :(得分:1)

我认为你是对的,很多这些框架都是从你不应该成为一名程序员来理解测试内容的想法发展而来的(因此,在测试优先方法中,是什么该软件应该)。

例如,参见Cucumber BDD测试框架如何描述他们的系统:

  

Cucumber让软件开发团队描述软件的应用方式   表现纯文本。该文本以业务可读的方式编写   特定于域的语言,用作文档,自动化测试   和开发援助 - 全部采用一种格式。

Cucumber页面引用了2008年以后的

A piece by Martin Fowler,并提供了用于测试非本地域特定语言(DSL)的理由:

  

如果商务人士能够查看DSL代码并了解它,   那么我们就可以建立一个深层而丰富的沟通渠道   软件开发和底层域。

所有人都说过,我还没有看到或成为团队的一员,测试语言(以及它通常是将这种语法称为DSL的一种延伸)实际上是由软件开发人员使用的和#34;商界人士",但也许存在这种情况更常见的环境。好消息是,大多数常见的测试框架足够灵活,可以使用您喜欢的任何语法支持测试,包括您自己喜欢的本地/惯用方言,因此您可以自由地避开{{1}这种看似常见的做法。并且只说this.should.be.equal.to.that

答案 1 :(得分:1)

  

assert(typeof obj.foo != 'undefined');

这种方法存在一个严重的问题:它不会在失败时产生良好的信息。在这种特定情况下,唯一的失败是obj.foo == undefined,但一般情况下,您希望测试框架能够报告与预期不同的内容

出于这个原因,您的“最小测试特定功能集”实际上非常大。像你提到的花哨结构有助于组织事物,因此它不是一个庞大的函数列表,特别是你可以避免冗余需要“assertContains”和“assertNotContains”等等(其实现将非常相似)和相反,有一个"不是"改性剂。

使测试断言的结构看起来像英语在某些人看来很受欢迎,但我并不在乎自己捍卫它 - 我只是在这里指出有一个复杂的原因测试断言框架。