【问题标题】:Test smell.... is this good practise?测试气味....这是好习惯吗?
【发布时间】:2012-09-12 19:48:20
【问题描述】:

我有两个测试,它们完全相同...除了两件事外,它们调用两个单独的服务调用..因此,当我使用 mockito 时,我有两个单独的期望和验证行...

这就是我所做的:

@test
TestA {
   baseTest("player");
}

@test
TestB {
  baseTest("member");

}

BaseTest(type type) {
  ....
  .....
  if type(player) {
    Mockito.when(player service call)
  }
  else {
    Mockito.when(member service call)
  }

  // make the call in code

  //verify

  if(player) {
     verify player specific service call...
  }
  else {

  }
}

我认为以上是测试气味...只是感觉不对...

有没有比在我的 baste 测试中放置 If 语句更好的方法?

【问题讨论】:

  • @maba,我开始同意你的观点,但这个用户是相当新的。抱住希望他会回来。
  • @TecBrat 我知道我们不应该评论人们的 AR,但在这种情况下我无法抗拒......
  • @maba 我又问什么是 AR?... MFA!!
  • @maba.. 我明白了...你是个非常聪明的人!!

标签: java junit4 mockito spring-test spring-test-mvc


【解决方案1】:

我仍然会分别实现 2 个测试类。代码长度和重复对于测试来说并不重要,代码可读性、完整性和正确性是优先考虑的。鉴于此,只需分别实现 2 个测试用例。

【讨论】:

  • 代码长度和重复在测试中很重要。如果您可以重构掉重复的测试功能,那么您绝对应该这样做。维护更少的代码总是比维护更多的代码更容易。我赞扬 OP 试图减少测试代码的数量,即使他们没有以最好的方式做到这一点。请参考@artbristol 的回答,了解我对最佳方法的看法。
【解决方案2】:

在任何你看到重复的 if 语句的地方,你都可以使用多态性。您应该在超类 BaseTestSuper 中抽象“玩家服务调用”和“成员服务调用”方法,它也将拥有现有的 BaseTest 方法..

【讨论】:

  • +1 表示多态性建议。我不确定在测试中使用它,但它非常有趣。
【解决方案3】:

您应该独立开发您的测试代码,并在有意义时加入。

举个例子。初始化代码(Arrange/Act/Assert 的第一个 A)的一个经验法则是:

  1. 您应该在测试中编写测试方法的所有 Arrange 部分。
  2. 如果您的方法与所有其他方法共享初始化,则将其放入 @Setup 方法中
  3. 如果某些测试方法不共享该初始化,可能是因为它不适合该测试用例。

所以我的结论是:

  1. 编写独立测试
  2. 如果他们共享内容,您可以重构
  3. 但不要太多(或者像“如果”这样奇怪的东西)!!!增加了复杂性,而不是重复使用。

事实上,@artbristol 的回答是有道理的:如果您使用 if 来替代行为,请考虑多态性。只是我不确定直到哪一点它对测试很复杂(如果代码正在测试类似的类层次结构,这可能是有意义的)。

【讨论】:

    【解决方案4】:

    一般来说,您不应该在测试中增加任何复杂性。首先,您可能会在那里犯错(即使在简单的 if 中)。其次,您的测试不再是文档,这意味着您无法轻易理解被测类的使用场景和行为。

    所以它是一种气味。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-27
      • 2016-01-03
      • 2021-07-17
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多