`
sdyouyun
  • 浏览: 119462 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

改进TestNG的测试方法依赖管理

阅读更多
TestNG是一个很强大的单元测试工具。和JUnit3、4版本相比,TestNG都多了一个很好的功能“测试依赖”。比如我可以写一个测试方法如下:
	@Test(dependsOnMethods="testMethod2")
	public void testMethod1() {
        System.out.println("in testMethod1");
	}

这样就表示在执行testMethod1测试之前,先去检查一下testMethod2这个方法,如果testMethod2这个方法测试通过了,才会执行testMethod1,否则直接将testMethod1的执行结果标记为“skipped”。在大型项目的测试中,特别是涉及到一些不纯粹是单元测试的测试时,这个特性非常有用。dependsOnMethods的属性可以引用其他类中的测试方法,如可以写成@Test(dependsOnMethods="com.test.Test1.testMethod2")。

但这样,我如果要单独执行某个测试类的话,麻烦就来了(这种单独执行某个测试类的方法在单元测试中基本不存在,但在一些自动化的集成测试、功能测试中因为执行时间的问题就很常见了)。我写了在com.test.Test1这个类的某个测试方法里写了@Test(dependsOnMethods="com.test.Test2.testMethod2"),在执行Test1时,会直接提示出错找不到testMethod2方法,只有把Test1和Test2作为一个suite来统一执行的时候才可以正常运行。

TestNG还有对Group的依赖管理,也同样有这个问题。

为了解决这个问题,得到一个适合做集成测试、功能测试的TestNG版本,研究了一些TestNG的源代码,发现修改两个地方可以解决这个问题:
1. org.testng.internal.MethodHelper的findMethodsNamed方法。这个方法是用来根据名字查找测试方法的,不存在会抛出异常。将抛出异常的部分注释掉即可,如下。
			if (!foundAtLeastAMethod) {
				System.out.println("依賴的方法沒有找到。");
				
//				throw new TestNGException(mainMethod
//						+ "() is depending on nonexistent method "
//						+ currentRegexp);
			}

这个方法只有在检查测试依赖项时才会被调用,可以放心修改,不会影响其他功能。
2. org.testng.internal.Invoker类的checkDependencies方法,这里头有一段为检查依赖中是否有不存在group,将其注释掉即可。

		// Any missing group?
		// if (testMethod.getMissingGroup() != null) {
		// return false;
		// }



这样修改了之后,当某个测试方法的依赖中有不存在的method或者group时,就不会skip这个method,而是直接执行这个method了。开源的东西果然还是方便啊。
  • testng-5.8-jdk15.jar (824.3 KB)
  • 描述: 修改了依赖管理之后的testng5.8,适用于jdk1.5版本
  • 下载次数: 53
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics