2010-12-16 32 views
4

我开始使用JavaScript的测试驱动开发,但我想在不同的项目中开始使用它。做测试驱动开发之前的注意事项

我想知道哪些典型的错误以及如何避免它们?

此外,我想知道我应该阅读什么使测试驱动开发更容易学习和适用于我的代码。

在此先感谢。

回答

10

我使用TDD遇到的最大问题是开发人员对单元测试没有信心。较差的单元测试会浪费更多的时间。混淆,不可信,不可维护,难以读懂的测试很快就会落空,让开发人员花时间想要再次自动进行单元测试。

每Fagrell提​​出了一些很好的观点,特别是关于每次更改后运行测试;在任何测试更改之前和之后,它应该成为第二种运行测试的性质。


框架:

考虑QUnit作为你的JS测试框架:http://docs.jquery.com/Qunit

我已经得到了与相关标记的测试工具Page Up和测试在页面加载运行很好。

您可以按照

  • 安排
  • 断言

流量使用QUnit单元测试。

但是,您必须手动执行测试设置和拆卸方法,并在您的测试方法中调用它们。这些将有助于隔离测试用例,方法是保持所有测试的条件不变,并防止测试依赖于它们的运行顺序。

在您将使用的其他语言中查找有用的框架。对于.NET来说,NUnit非常流行。


隔离:

每Fagrell也使得有关隔离好点。在开始测试之前,应该充分理解单元测试(测试功能原子的一个方面)和集成(测试多个原子如何一起工作)之间的区别。如果在测试方法中有多个断言,那么您不是单元测试,而需要更改测试方法。


约定:

从优秀The Art Of Unit Testing为你的测试良好的命名约定是MethodUnderTest_Condition_ExpectedBehaviour例如

Expand_TextVariable_ExpandsText

the same book保持你的检查:

  • 信得过
  • 维护的

否则,你和其他开发商不会打扰る指导测试。


伪造品:

一个常见的误解是两种类型的假货之间的差:存根嘲笑

A seam在代码中通过抽象代码依赖于接口的功能来创建。例如。控制器不依赖于具体的存储库,它将取决于IRepository。

A stub然后实现这个IRepository并返回伪造值;它用于隔离控制器代码以独立运行。例如GetCustomer()将创建一个新客户并返回该客户,而不会调用实际存储库或任何商店。 存根不会针对进行测试。
A 模拟就像一个存根,只是它可以容纳可以测试的值。例如AddCustomer(Customer customerToBeAdded),你的模拟会接受这个价值,并可以坚决反对。 Mocks可以根据进行测试。

查看一个测试隔离框架(或Mocking Framework),它可以自动为给定接口创建假货。

对mock目的的误解导致我看到的不止一个开发人员创建了一个模拟测试功能,然后针对mock自己编写测试。


资源:

我已经提到The Art Of Unit Testing和我彻底推荐它。这是其中的一本书,以及Code Complete,如果办公室着火,我会抓住它。

希望有所帮助。

3

确保您的测试只测试一项功能。名称和断言应该完全与此一致。例如。如果要向可变处理程序添加expand()函数,则应该(大体上)调用test_expands_variables或should_expand_defined_variable或适用于您的命名约定的任何测试,并且断言应该只有位于返回值或旁路值上,函数调用的效果。一个常见的错误是断言设置步骤,但设置中的任何功能都应该有其自己的测试,并且确切已经存在该断言。如果你在任何地方声称同样的东西,突然很难看出你应该在哪个测试正在修复。

感受整个TDD循环的好起点是尝试一些代码 - 卡塔的。 Roman-numeral converter是首先编写测试的常用第一介绍。一开始就是真的是肛门关于跑步后后面的测试每变化不大。一旦你掌握了它,你会感觉到你需要/应该如何迷恋,但为新手准备节奏通常需要真正的迂腐。

0

我已经开始使用基于Christian Johansen的书“Test-Driven JavaScript Development”开始进入JavaScript的TDD。它非常出色,几乎涵盖了TDD的所有方面并将其应用于JS:http://tddjs.com/