我开始使用JavaScript的测试驱动开发,但我想在不同的项目中开始使用它。
我想知道什么是典型的错误以及如何避免它们?
此外,我想知道我应该阅读什么,以使测试驱动开发更容易学习并应用于我的代码。
提前致谢。
答案 0 :(得分:10)
我使用TDD遇到的最大问题是开发人员对单元测试没有信心。不良的单元测试浪费的时间比节省的时间多。困惑,不值得信赖,不可维护,难以理解的测试很快就会被淘汰,而且开发人员需要时间来再次自动进行单元测试。
Per Fagrell提出了一些好处,尤其是关于在每次更改后运行测试;在任何测试更改之前和之后运行测试应该成为第二天性。
<强>框架:强>
将QUnit视为JS测试的框架:http://docs.jquery.com/Qunit
我有一个带有依赖标记的测试工具页面,测试在页面加载时运行得非常好。
您可以按照
进行操作使用QUnit进行单元测试的流程。
但是,您必须手动实施测试设置和拆卸方法,并在测试方法中调用它们。这些将有助于隔离测试用例,保持所有测试的条件不变,并防止测试依赖于其运行的顺序。
在您将使用的其他语言中寻找有用的框架。 NUnit非常适合.NET。
<强>隔离:强>
Per Fagrell也对隔离提出了一个很好的观点。在开始测试之前,应该彻底理解单元测试(测试功能原子的一个方面)和集成(测试多个原子如何一起工作)之间的区别。如果在测试方法中有多个断言,则不是单元测试,需要更改测试方法。
<强>公约:强>
优秀The Art Of Unit Testing测试的良好命名惯例是 MethodUnderTest_Condition_ExpectedBehaviour ,例如
<强> Expand_TextVariable_ExpandsText 强>
从the same book开始测试:
否则你和其他开发人员都不会费心去运行测试。
<强>伪造品:强>
常见的误解是两种假货之间的区别:存根和模拟。
通过抽象代码依赖于接口的功能,在代码中创建接缝。例如。控制器不依赖于具体的存储库,它将依赖于IRepository。
存根然后实现此IRepository并返回伪造的值;它用于隔离控制器代码以隔离运行。例如GetCustomer()
将创建一个新客户并返回该客户,而不会调用真实存储库或任何商店。 Stubs永远不会被测试
模拟就像一个存根,只不过它可以保存可以测试的值。例如AddCustomer(Customer customerToBeAdded)
,你的模拟将接受该值,并可以断言。 可以对模拟进行测试。
查看测试隔离框架(或模拟框架),它可以自动为给定的接口创建假货。
对模拟目的的误解导致我看到不止一个开发人员创建了一个模拟测试功能,然后针对模拟本身编写测试。
<强>资源:强>
我已经提到The Art Of Unit Testing,我会彻底推荐它。如果办公室起火,我会抓住这本书和Code Complete之一。
希望有所帮助。
答案 1 :(得分:3)
确保您的测试仅测试一项功能。名称和断言也应与之完全一致。例如。如果你要将一个expand()函数添加到一个变量处理程序中,那么应该(大致)调用test_expands_variables或should_expand_defined_variable或任何适合你的命名约定的测试,并且断言应仅在返回值或函数调用的副作用。一个常见的错误是断言设置步骤,但是设置中的任何功能都应该有自己的测试,并且已经存在。如果你在任何地方断言同样的事情,突然很难看出你应该正在修复哪个测试。
感受整个TDD循环的一个好的起点是尝试一些代码 - kata。 Roman-numeral converter是首先编写测试的常见介绍。在开始时,真正肛门关于在每次稍微改变之后运行测试。一旦掌握了它,你就会感觉到你需要/应该是多么强迫,但是为初学者提供节奏通常需要非常迂腐。
答案 2 :(得分:0)
我已经开始使用Christian Johansen撰写的“测试驱动的JavaScript开发”一书在Javascript中进入TDD。它非常出色,几乎涉及TDD的所有方面,并将其应用于JS:http://tddjs.com/