Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 进行测试驱动开发之前的考虑事项_Unit Testing_Tdd_Js Test Driver - Fatal编程技术网

Unit testing 进行测试驱动开发之前的考虑事项

Unit testing 进行测试驱动开发之前的考虑事项,unit-testing,tdd,js-test-driver,Unit Testing,Tdd,Js Test Driver,我开始使用JavaScript的测试驱动开发,但我想在我的不同项目中开始使用它 我想知道什么是典型的错误以及如何避免它们 另外,我想知道我应该读些什么,以使测试驱动开发更易于学习并应用于我的代码 提前感谢。确保您的测试只测试一项功能。名称和声明也应该与此完全一致。例如,如果要将expand()函数添加到变量处理程序中,则该测试应被称为(大致)test_expans_variables或应_expans_defined_variable或符合命名约定的任何内容,并且断言应仅针对函数调用的返回值或副

我开始使用JavaScript的测试驱动开发,但我想在我的不同项目中开始使用它

我想知道什么是典型的错误以及如何避免它们

另外,我想知道我应该读些什么,以使测试驱动开发更易于学习并应用于我的代码


提前感谢。

确保您的测试只测试一项功能。名称和声明也应该与此完全一致。例如,如果要将expand()函数添加到变量处理程序中,则该测试应被称为(大致)test_expans_variables或应_expans_defined_variable或符合命名约定的任何内容,并且断言应仅针对函数调用的返回值或副作用。一个常见的错误是断言设置步骤,但是设置中的任何功能都应该有自己的测试,并且断言已经就位。如果你在任何地方都坚持同样的观点,那么突然就很难看出你应该修改哪个测试了


要了解整个TDD循环,一个很好的起点是尝试一些代码kata。是一个常见的先写测试的介绍。在一开始,在每一个小的变化之后,都要真正地分析一下运行测试。一旦你掌握了窍门,你就会感觉到你需要/应该有多着迷,但是要让初学者掌握节奏通常需要非常学究。

我使用TDD遇到的最大问题是开发人员对单元测试缺乏信心。糟糕的单元测试浪费的时间比节省的时间多。混乱的、不可信的、不可维护的、不可读的测试很快就被淘汰了,厌倦了的开发人员花时间想要再次自动进行单元测试

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


框架:

考虑将QUnit作为JS测试的框架:

我有一个带有依赖标记的测试工具页面,测试在页面负载下运行得非常好

你可以按照

  • 安排
  • 表演
  • 断言
使用QUnit进行单元测试的流程

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

在您将要使用的其他语言中寻找有用的框架。在.NET中非常流行


隔离:

Per Fagrell也提出了一个关于隔离的好观点。单元测试(测试原子功能的一个方面)和集成(测试多个原子如何协同工作)之间的区别应该在开始测试之前彻底理解。如果一个测试方法中有多个断言,那么您不是单元测试,需要更改测试方法


惯例:

优秀测试团队的一个好的命名约定是测试条件下的方法预期行为

展开\u text变量\u展开text

从保留您的测试:

  • 可靠的
  • 可维护
  • 可读的
否则,您和其他开发人员将不会费心运行测试


赝品:

一个常见的误解是两种假货之间的区别:存根模拟

通过将代码所依赖的功能抽象到接口中,在代码中创建了一个seam。例如,控制器不依赖于具体的存储库,而是依赖于IRepository

一个存根然后实现这个IRepository并返回伪造的值;它用于隔离要隔离运行的控制器代码。e、 g.
GetCustomer()
将创建一个新客户并返回该客户,而不调用真正的存储库或任何商店存根从不根据进行测试
模拟类似于存根,不同的是它可以保存可以测试的值。e、 g.
AddCustomer(Customer-customerToBeAdded)
,您的模拟将接受该值,并且可以针对该值进行断言模拟可以针对进行测试

看一看测试隔离框架(或模拟框架),它可以自动为给定接口创建假货

对mock用途的误解导致不止一个开发人员创建了mock来测试功能,然后针对mock本身编写测试


资源:

我已经提过了,我完全推荐它。这是其中一本书,连同《代码完成》,如果办公室着火,我会抓到它


希望这能有所帮助。

我已经开始学习Javascript中的TDD,这是Christian Johansen的《测试驱动的Javascript开发》一书。它非常优秀,几乎涵盖了TDD的所有方面,并将其应用于JS: