单元测试中的“坏”属性是什么?

时间:2010-10-12 10:58:54

标签: unit-testing

我刚刚阅读question,它回答了单元测试的理想特征,但应该避免什么?是什么让单元测试“糟糕”?

您见过的最糟糕的单元测试是什么? (例如。我记得一位开发人员告诉我,他曾经发现一个测试套件有很多方法,但完全没有任何断言)。

我特别感兴趣的是单元测试稍微有些细微和具体的问题,例如假设你有一个测试套件,运行速度快,覆盖范围广,它还有什么问题?

6 个答案:

答案 0 :(得分:9)

  • 使用外部依赖项(数据库,文件,服务器,时间......)进行测试

  • 相互依赖的测试

  • 验证实施而不是行为的测试

  • 测试速度太慢,没有人执行

  • 测试过多的东西

还有TDD anti-patterns

答案 1 :(得分:3)

对于我而言,单元测试的可读性是最佳选择。如果我在2秒内无法阅读和理解测试,那可能有些不对劲。任何超过5行的测试最好有一个很好的借口。

有时人们会将重构过多,我必须查看各种帮助程序类或父类,以找出正在测试的内容。重构测试时始终牢记可读性。如果这意味着测试更清晰,有时最好留一点重复。

答案 2 :(得分:2)

脆弱的测试通常会产生不可接受的维护开销,这会导致测试无法更新,处于损坏状态,并且由于与源代码不同步而无法运行。

脆弱的测试通常依赖于文件系统,注册表项,数据库等...这些在集成和系统测试中都很好但有时我看到测试伪装(拼写?)作为具有这些属性的单元测试,这通常是个问题。

答案 3 :(得分:1)

最好的单元测试很容易阅读和理解。快速执行。经测试的特定功能,经过重构并得到维护。

最糟糕的不是以上。

答案 4 :(得分:1)

根据CW的精神,我知道有一天它会派上用场。

你也确实要求一个特定的:)见下面的MAGIC块

@Test
      public void testCheckForDuplicateCustomer() {
            //List<CustomerSearch> customerInfo = null;
            String customerName = null;
            boolean status = false;
            try {
                  status = custSearchService.checkForDuplicateCustomer(customerName);

/*************/ MAGIC BEGINS HERE
                      if(status){
                            assertEquals(true, status);
                      } else {
                            assertEquals(false, status);
                      }
                      /**************/ MAGIC ENDS HERE
                } catch (Exception e) {
                      //fail();
                }
          }

答案 5 :(得分:0)

测试不够或根本没有测试。

例如,如果在方法执行时未验证相关的输出参数或对象数据,则仅检查方法的返回值是不够的。

测试运行正常,覆盖范围很高但是你没有真正验证任何东西......