JUnit 4 和 TestNG 曾经是可以比较的。这两个测试框架各有优缺点是什么?
JUnit 4 和 TestNG 曾经是可以比较的。这两个测试框架各有优缺点是什么?
我今天比较了TestNG和JUnit4,根据我有限的测试框架经验,我可以指出TestNG具有更优雅的处理参数化测试的方式,使用数据提供程序概念。
就我所知,在JUnit4中,您必须为要测试的每组参数创建单独的测试类(使用@RunWith(Parameterized.class)
运行)。而在TestNG中,您可以在单个测试类中拥有多个数据提供程序,因此您也可以将单个类的所有测试保存在单个测试类中。
到目前为止,这是我能指出的关于TestNG优于JUnit4的唯一好处。
Intellij IDEA支持TestNG和JUnit的开箱即用。但是,Eclipse仅支持JUnit,并需要安装TestNG插件才能使其工作。
然而,我在使用PowerMock模拟测试中遇到的一个更烦人的问题是,如果您正在使用PowerMock模拟您的测试中的依赖项,则测试类需要扩展PowerMockTestCase
。显然,当使用PowerMock时,可以通过特殊方法或testng.xml
套件定义来配置测试框架所需的对象工厂,但这些方法似乎已经失效。我不喜欢将测试类扩展为测试框架类,这似乎是hackish。
如果您不使用PowerMock,这当然不是问题,但总体而言,我认为JUnit4得到了更好的支持。
基于我对两个框架的经验,testng有一些方便的功能,而JUnit团队已经拒绝实现了几年。因此,我更喜欢testng。转换到testng很容易,因为它基本上支持JUnit中的所有内容(甚至在eclipse中有一个转换插件)。但由于缺少这些功能,转换回JUnit并不理想。
在testng中,@BeforeClass
方法不是静态的,并且在该类中的测试运行之前执行,而不是在加载测试类时执行(JUnit的行为)。我曾经有一个JUnit项目,在这个项目中所有的数据库测试(几十个)都在开始时初始化了数据库,这是相当愚蠢的行为。在JUnit社区中进行了很多争论。其主要观点是每个测试方法应该有自己的测试夹具,因此您不应该有一个非静态的beforeAll样式方法,因为那样会允许您偷偷地设置一个实例变量,然后在所有测试中使用它。虽然有效,但对于集成测试来说真的很麻烦。TestNG在这里给用户提供了选择。JUnit没有,这很烦人。
Testng数据提供者比JUnit的等效物更灵活。您可以针对每个测试指定提供输入的数据提供程序方法,而不是像JUnit中一样为整个类使用通用方法。因此,您可以在一个类中为测试设置正向和负向案例的数据提供程序。非常好用。
您可以在testng中使用@Test
标记一个类,这意味着:每个公共方法都是一个测试。在JUnit中,您需要复制/粘贴@Test
到每个方法中。
这两者都有一个问题,就是hamcrest与JUnit捆绑在一起,JUnit与testng捆绑在一起的方式。 在maven中有一些备选的jar文件可以解决这个问题。
我对这两个框架的担忧在于它们似乎已经停止了发展。发布越来越不频繁,也越来越少有值得注意的功能。例如,整个BDD运动似乎对任何一个框架都没有产生影响。此外,JUnit本身也可以采用我列出的大部分内容。JUnit没有办法实现这些功能,其实并没有技术上的限制; 只是JUnit背后的人选择不去实现这些功能。这两个项目似乎也缺乏未来方向的愿景,为过去几年的微小调整感到满意。
ScalaTest
框架只有JUnitRunner
来运行您的scala测试。换句话说,您有一个选择:
你可以使用Mockito作为你的模拟框架。它与TestNG集成得非常好。你不需要扩展任何类来使用Mockito与TestNG。这样你的测试代码就不会紧密耦合,如果出于任何原因你需要使用其他模拟框架,也很容易实现。