我正在为我的webapp编写单元测试。我的许多测试用例共享相同的样板。例如,从购物车中移除商品和更新购物车中商品数量的测试都从导航到产品页面,搜索产品并将其添加到购物车开始。
是否应该以某种方式将这些重复的代码从单元测试中分解出来?我应该写一个函数add_item_to_cart
吗?但是,我有另一个测试test_add_to_cart
,它基本上只包含添加到购物车的重复样板。
由于每个测试需要独立,因此单元测试本质上不是DRY吗?
答案 0 :(得分:3)
Unit tests are supposed to test just one thing。以“导航到产品页面,搜索产品,并将其添加到购物车”开始的测试 - 这就是三个不同的东西 - 听起来根本不是单元测试,而是集成测试。我怀疑你实际上有两个不同的测试要在这里构建。
您的Cucumber或类似内容中的集成测试应包含一系列步骤:
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)
如果事实证明这非常复杂且涉及大量存根,那么这表明您的代码不是模块化的;解决方案是TDD并首先编写测试,而不是之后添加它们。
答案 1 :(得分:2)
至少将公共代码重构为一个函数,并在启动时调用此函数。您希望测试特定于测试的代码,而不是重复的设置代码(应在其他地方测试)
答案 2 :(得分:1)
您应该对测试应用与任何其他代码相同的原则。
考虑一下例子然后你改变一些会破坏你的测试的东西。您是希望在一个地方或每个测试中更新测试代码吗?
我认为答案是显而易见的。