跨语言测试驱动开发


9

简短的问题:您如何在跨多种语言的项目中遵循测试驱动开发?

具体来说,我正在编写一个使用JavaScript和PHP的Web应用程序,我想遵循TDD原则,但是我不确定如何将它们集成在一起。是否为JS和PHP部分运行单独的测试套件,并在JS套件中使用模拟来模拟服务器响应?是否有一种技术可以一次测试两个组件?

这是我第一次使用“测试驱动开发”,因此您可以分享有关如何减少测试难度的任何建议都是很棒的。我之所以选择它,是因为一旦完成原型,需求就改变了,迫使我改变设计。我认为如果我要从头开始,我想从一开始就使用内置的回归测试编写更可扩展的代码。

我正在SimpleTest中编写PHP测试,在JsTestDriver中编写JavaScript测试。我习惯了面向对象的范例,因此在PHP中有一些类,并且我在JavaScript中使用原型继承来做类似的事情。我也已经开始阅读有关Python中TDD的书有关JavaScript中TDD的书,但是从我看到的所有内容来看,这些并没有描述对应用程序进行完整的测试(除了使用Selenium或其他Web驱动程序之外)进行前端验收测试,TDD是否不适合全栈开发人员使用?


1
除非您被迫使用SimpleTest,否则建议您切换到PHPUnit。SimpleTest似乎不是很活跃,并且在模拟和代码覆盖方面有些落后。
塞拉德2015年

Answers:


9

是否有一种技术可以一次测试两个组件?

这实际上与单元测试相反-单元测试(尤其是TDD样式)意味着隔离测试组件。因此答案是肯定的,“为JS和PHP部分运行单独的测试套件 ”,否则不是单元测试,也不是TDD。

当然,自动化集成测试可以“一次运行即可测试两个组件”,并且您可以完全利用您已经提到的工具(例如Selenium)。但是这些通常是更复杂的测试,是在TDD周期之外开发的。


3

重要的是要区分TDD和ATDD。那里的AT代表“ 验收测试”,这是指您首先从验收测试开始的开发,这很可能会测试整个堆栈。有时也称为“外部测试驱动开发”。人们谈论TDD时,“ T”可能专门指单元测试。

单元测试的关键部分是将被测单元与其依赖项隔离开来。这给您两个非常重要的好处:

  • 您可以使测试变得非常快,因此在非常短的反馈周期中,您可以经常运行它们。而不是每个小时运行一次,您应该能够在每个微小的更改之后运行所有的单元测试,因此您可以立即获得他们的反馈,以了解该更改是否破坏了任何内容。

  • 您的测试可以同时针对非常具体的行为。如果其中之一失败了,您应该能够几乎立即确定测试所指示的错误的确切性质。

由于这种隔离的重要性,您将自动希望测试被限制为比语言边界迫使您使用的单元小得多的单元。尽管这不是一成不变的规则,但您通常希望单个类是可测试的单元。因此,就TDD而言,语言问题或多或少无关紧要。

另一方面,如果要执行ATDD,请确保您专门为此目的研究资源(它通常作为BDD的一部分来完成,因此也请查看针对此的工具)。这就是Selenium之类自然适用的地方。通常,在执行ATDD时,您仍然编写单元测试,并且实际上,为了通过每个验收测试,您也可以通过单元测试来测试其实现。因此,即使您确实想执行ATDD,了解如何编写单元测试也仍然很重要。


太酷了,我从没看过ATDD,但我对Behat和Behave for BDD很熟悉。感谢您的反馈。仍在尝试绕开TDD的微测试思维:)
Chris Olsen 2015年

@ChrisOlsen有两个方面可以解决您的问题:单元测试(相对于集成或接受)以及编写它们的时间(在生产代码之前而不是之后)。如果他们俩看起来像是奇怪的心态,则可以尝试先掌握第一种,再掌握第二种。很多人不练习TDD,但仍然坚持非常彻底的单元测试范围。
Ben Aaronson

1

同样,您不必为整个应用程序堆栈使用TDD。TDD作为一种开发方法,更适合于应用程序的逻辑部分。需要更多实验性的部分,例如前端的设计,确定性交互或数据库域,最好以传统样式完成,因为您尚不知道这是否将是最终版本。

但是应用程序的逻辑将来不应改变,如果这样做,您将面临可怕的需求蔓延。这使得它非常适合用于进行回归测试的套件,以便在每次更改代码时都充满信心,这是TDD的最终目标。

鲍伯叔叔比我更好地解释了这种方式。 https://blog.8thlight.com/uncle-bob/2014/04/30/When-tdd-does-not-work.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.