2009-04-17 87 views
5

如果您正在测试一个像下面那样的计数函数,那么在一个函数中为函数测试多个事情,是否认为是“正确”或“错误”,而不是每个测试都具有测试函数?在单个测试中断言多个条件,还是分成多个测试?

function testGetKeywordCount() { 
    $tester = $this -> getDatabaseTester($this -> CompleteDataFile); 
    $tester -> onSetUp(); 

    $KeywordID = 0; 
    $this -> setExpectedException('InvalidArgumentException'); 
    $this -> keyword -> getKeywordCount($KeywordID,'Active'); 

    $KeywordID = 1; 
    $this -> setExpectedException('InvalidArgumentException'); 
    $this -> keyword -> getKeywordCount($KeywordID,'InvalidStatus'); 

    $this -> assertEquals(1, $this -> keyword -> getKeywordCount($KeywordID,'Active')); 

    $tester -> onTearDown(); 
} 

回答

4

您应该有多个测试功能,其中每个测试功能测试其自身的条件。这样不用调试就能更容易发现故障。

4

每个场景都有一个测试用例是理想的。但是,在某些情况下,在一个测试用例中测试多个场景会更方便(从实施工作的角度来看效率更高)。如果您使用的框架在首次失败时不会停止,但会尽可能在测试用例中执行,那么该框架适用于每个测试用例的多个场景。

我更喜欢在单元测试上花费尽可能少的时间,并且在那段时间仍尽可能多地覆盖覆盖范围。最后,重要的是你如何实现单元测试,而不是那些测试的正确性。

+0

如果我理解正确,那么您会说它更容易,但在一个测试用例中拥有更多场景的“正确”程度却更低。 如果这意味着您将多个场景放入一个测试用例中,因为制作多个测试用例的工作太多了,我会说:抽象它,让它更容易,更干燥来制作另一个场景。 测试也是编程imho和应该做或多或少相同的原则,如DRY。 – 2010-01-31 21:17:15

1

测试框架并不总是值得你努力遵循每个测试规则的一个断言。

为Ruby做的一件事是RSpec,它允许您设置nested example groups。例如:

  • A用户
    • 没有密码
      • 无效
      • 抛出异常
    • 用密码
      • 已使用前
        • 无效
        • 抛出异常,尚未使用之前
          • 有效
          • 重定向到帐户页面
        • 旅行安全警告

通过逐步建立场景和测试一路走来的每一步,它更容易坚持,每个测试方法的一个断言。这也使得更容易发现未经测试的情况。

0

我不会在上面的示例代码中谈论单元测试。
你的例子更多的是一个自动功能测试,测试一个功能流。

BUT 在这种情况下,它是精细有多个断言。

只要确保2个断言不是一前一后。

为例如

public void ValidateRulesEntry_Valid_ValidConditionsFromFile() 
{ 
    string condition = "Target.HasValue"; 
    string returnMessage; 

    bool successFul = CodeParserTryParseCondition(condition, out returnMessage); 


    Assert.IsTrue(successFul); 
    Assert.IsFalse(string.IsNullOrEmpty(returnMessage)); 
    Assert.IsTrue(returnMessage == "OK"); 

} 

的2个最后断言是依赖于第一断言的IsTrue运算(成功)。

想想:如果测试失败 - >告诉我为什么(没有寻找到调试输出)

1

有一种说法为分裂主张分成两个单独的测试是,如果断言之一失败,则”会有一次失败;如果两个断言都失败了,你会得到两个失败。

而且,通过使每个测试的名称暗示可能,你会当东西坏了获得额外的线索。

0

这是取决于你问它谁不同答案的问题,主要取决于他/她的个人意见或专业经验。有些超理论的人会告诉你,在测试中有一个以上的断言是一个至高无上的罪,你就要永远注定。但其他具有更多实际经验的人可能会告诉你,每次测试中有10次甚至50次断言是完美的。

那么,谁是正确的?

在面对这样的困境时,我总是尽量做到客观,并且选择我决定用当今由认证和经验丰富的专业人士开发的一些最流行的github回购库进行小型研究。

那么,如何大玩家测试他们自己的项目?更重要的是,单元测试框架是如何进行单元测试的?

让我们看几个例子:

休眠

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/engine/spi/EntityEntryTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/engine/spi/NonSortedExecutableListTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/engine/spi/SortedExecutableListTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/src/test/java/org/hibernate/envers/test/JpaStaticMetamodelTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-hikaricp/src/test/java/org/hibernate/test/hikaricp/HikariCPConnectionProviderTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-proxool/src/test/java/org/hibernate/test/proxool/ProxoolConnectionProviderTest.java

https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/AntPathMatcherTests.java https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/ClassUtilsTests.java https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.javahttps://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/AutoPopulatingListTests.java

的junit 4

https://github.com/junit-team/junit4/blob/master/src/test/java/junit/tests/extensions/ActiveTestTest.java https://github.com/junit-team/junit4/blob/master/src/test/java/junit/tests/extensions/RepeatedTestTest.java https://github.com/junit-team/junit4/blob/master/src/test/java/junit/tests/runner/ResultTest.java https://github.com/junit-team/junit4/blob/master/src/test/java/org/junit/rules/TimeoutRuleTest.java

的junit 5

https://github.com/junit-team/junit5/blob/master/platform-tests/src/test/java/org/junit/platform/launcher/core/DefaultLauncherTests.javahttps://github.com/junit-team/junit5/blob/master/platform-tests/src/test/java/org/junit/platform/launcher/core/LauncherDiscoveryRequestBuilderTests.java https://github.com/junit-team/junit5/blob/master/platform-tests/src/test/java/org/junit/platform/launcher/listener/SummaryGenerationTests.java https://github.com/junit-team/junit5/blob/master/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/StandardTestClassTests.java https://github.com/junit-team/junit5/blob/master/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/DiscoveryFilterApplierTests.java

谷歌真相

https://github.com/google/truth/blob/master/core/src/test/java/com/google/common/truth/DoubleSubjectTest.java https://github.com/google/truth/blob/master/core/src/test/java/com/google/common/truth/BigDecimalSubjectTest.java https://github.com/google/truth/blob/master/core/src/test/java/com/google/common/truth/DoubleSubjectTest.java

正如我们在上面的例子中看到,专业开发人员似乎并不那么在意单个断言诫。事实上,他们大多数时候都违反了这条规则,看起来他们完全没有问题。也许他们忽略它,因为它不是一个严格的规则,而只是一个建议。 值得一提的是,即使是单元测试框架在大多数情况下每次测试都会测试多个断言。

所以我的结论很清楚:关于这个问题,在单个测试中拥有尽可能多的断言是完全有效的。如果专业开发人员这样做,你也可以这样做。

相关问题