为啥testng依赖junit?

Posted

技术标签:

【中文标题】为啥testng依赖junit?【英文标题】:Why does testng depend on junit?为什么testng依赖junit? 【发布时间】:2016-06-29 17:48:52 【问题描述】:

testngjunit 作为传递性 Maven 依赖项引入项目。它不应该是junit的替代品吗?

来自mvn dependency:tree

[INFO] +- org.testng:testng:jar:6.9.6:test
[INFO] |  \- junit:junit:jar:4.10:test
[INFO] |     \- org.hamcrest:hamcrest-core:jar:1.1:test

说真的,为什么? 这会导致持续的痛苦,因为 IDE 提供了导入两个 @Test 注释,它们在使用上几乎相同,导致项目中同时具有 junit 和 testng 测试。

排除junit传递依赖是否安全?什么可能会损坏?

【问题讨论】:

【参考方案1】:

免责声明:我是 TestNG 的贡献者。

我们在一些版本之前用 Gradle 替换了 Maven,但我们没有找到定义可选依赖项的方法。现在应该修复了:https://github.com/cbeust/testng/pull/844

这解释了为什么在某些版本中,您可以将 JUnit 视为 TestNG 的直接依赖项。 但这不是预期的行为,您可以毫无问题地将其从类路径中排除(如果您不需要它来运行某些 JUnit 测试)。

【讨论】:

【参考方案2】:

Edwin Buck's 答案是正确的,但我想添加一些有关依赖项本身的信息。 JUnit 被标记为optional 依赖(see the pom):

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <optional>true</optional>
</dependency>

根据the Maven documentation,这意味着如果您不需要该功能,您应该能够排除依赖:

想法是某些依赖项仅用于项目中的某些功能,如果不使用该功能则不需要。

所以,至少依赖被设计为能够被排除。

为了详细说明 TestNG 和 JUnit 的连接方式以及您可能需要依赖的功能,TestNG 支持direct execution of Junit tests。根据文档,这将被实现为:

<test name="Test1" junit="true">
    <classes>
        <!-- ... -->

【讨论】:

【参考方案3】:

因为testng 提供JUnit 集成,因此可以在testng 框架内运行JUnit 测试。基本上,它被添加为将JUnit 测试从“JUnit 方式”迁移到“testng 方式”的路径。你可以阅读更多关于它的信息here。

我不知道testng 是否会在移除此集成的情况下运行;但是,您始终可以删除传递依赖并找出答案。

【讨论】:

以上是关于为啥testng依赖junit?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确删除 Maven 项目中的依赖项

TestNg学习

TestNG入门到

testng中DataProvider为啥两组数据只执行了一组

junit常用及junit联合spring

PowerMock 入门