Unit testing 我的单元测试应该有多干燥?

Unit testing 我的单元测试应该有多干燥?,unit-testing,dry,Unit Testing,Dry,我正在为我的webapp编写单元测试。我的许多测试用例都使用相同的样板文件。例如,从购物车中删除商品和更新购物车中商品数量的测试都从导航到产品页面、搜索商品并将其添加到购物车开始 这种重复的代码是否应该以某种方式从单元测试中剔除?我是否应该编写一个函数将商品添加到购物车中?但是,我有另一个测试test\u add\u to\u cart,它基本上只包含这个添加到cart的复制样板文件 单元测试本质上不是干涸的,因为每个测试都需要独立吗?您应该将相同的原则应用于测试,就像应用于任何其他代码一样 举

我正在为我的webapp编写单元测试。我的许多测试用例都使用相同的样板文件。例如,从购物车中删除商品和更新购物车中商品数量的测试都从导航到产品页面、搜索商品并将其添加到购物车开始

这种重复的代码是否应该以某种方式从单元测试中剔除?我是否应该编写一个函数
将商品添加到购物车中
?但是,我有另一个测试
test\u add\u to\u cart
,它基本上只包含这个添加到cart的复制样板文件


单元测试本质上不是干涸的,因为每个测试都需要独立吗?

您应该将相同的原则应用于测试,就像应用于任何其他代码一样

举个例子,然后你改变一些会破坏你的测试的东西。您希望在一个位置或每个测试中更新测试代码吗


我认为答案是显而易见的。

至少将公共代码重构为一个函数,并在启动时调用该函数。您希望测试特定于测试的代码,而不是重复的设置代码(应该在其他地方测试)

。一个以“导航到产品页面,搜索产品,并将其添加到购物车”开始的测试——这是三件不同的事情——听起来根本不像是一个单元测试,而是一个集成测试。因此,我怀疑您实际上需要在这里构建两个不同的测试

在中或类似情况下,您的集成测试应包括一系列步骤:

When I navigate to the products page
 And I search for a product
 And I add it to the cart
您可以定义每个步骤一次,并多次使用,使其美观、干燥

另一方面,您的单元测试应该去掉所有必要的设置,只测试您感兴趣的一件事情:

before
  stub(cart)
  stub(product)
  click on "X" for item in cart
it should...
  expect(cart not to contain item)
  expect(product count to be updated)

如果这真的很复杂,并且涉及大量存根,那么这表明您的代码不是模块化的;解决方法是先编写测试,而不是事后添加测试。

我不同意这种说法。由于单元测试的过程性,使单元测试代码真正干燥可能非常困难。前/后语义学只能让你做到这一点。。。再加上一个事实,即相当大比例的测试完全无效,或者需要对某些类型的代码进行大量重构。所以,我认为,在测试中像实际代码一样枯燥会导致总体效率的损失。我认为需要做出一个价值判断,但我并不声称在内部明确定义了这个判断。依赖注入对于有效的单元测试是必不可少的