今天我们再来看一个重要的测试框架,TestNG (Test Next Generation)。
大家对JUnit应该已经很熟悉了,JUnit是我们开发人员常用的UT框架。我现在用JUnit+Mockito用的很好。
网上有一些JUnit vs TestNG的文章,但是普遍认为,TestNG提供了JUnit没有的更强大的功能。
一篇很简单的入门文章:
http://www.ibm.com/developerworks/java/library/j-testng/
官网:http://testng.org/doc/index.html
一开始就介绍了TestNG的几个所谓的“亮点”:
TestNG is a testing framework inspired from JUnit and NUnit but introducing some new functionalities that make it more powerful and easier to use, such as:
TestNG is designed to cover all categories of tests: unit, functional, end-to-end, integration, etc...
这样看来TestNG真的很强大!
TestNG user manuel:
http://testng.org/doc/documentation-main.html
其实扫一眼这个手册就能对TestNG有一个大概的认识。TestNG和JUnit最大的不同是:
我们写独立的unit test case时,在代码中使用JUnit提供的annotation,之后在IDE里运行Run as JUnit。或者运行Maven test等运行unit test并查看结果。
而在使用TestNG时,除了在UT代码中和JUnit使用类似的annotation以外,实际上还使用配置文件来配置运行什么test case。比如testing.xml,在这个文件中,我们可以配置要运行的class,method甚至package。
也就是说,如果在一个testing.xml中测试单个class,那么这就是一个UT。
如果在一个testing.xml中测试多个class或package,那么这就可以是一个集成测试或端到端测试。
这也是为什么说,TestNG覆盖了几乎所有种类的测试,包括UT,功能测试,端到端测试,集成测试 等等的原因。
而运行TestNG的方式也更灵活。我们可以选择在命令行中运行TestNG,或者使用ant,或在IDE中。
命令行提供了非常灵活的参数,让我们在运行测试时还可以控制要运行哪些test case,这样就不会被已经写好的配置文件或代码所限制,在每次运行测试时还可以根据需要,随意的控制。
一个例子:
java org.testng.TestNG testng1.xml [testng2.xml testng3.xml ...]
因此,运行TestNG实际就是运行xml文件中配置的那些test。TestNG会按照xml文件中指明的package或class去寻找source code中的annotation,并进行相应的操作。
很明显,我们甚至可以同时运行多个testing.xml,这样组合将更加灵活。比如系统由两个独立的组件构成,那么就可以创建两个配置文件:testingProgramA.xml, testingProgramB.xml。
这样就可以很方便的控制是进行一次小范围的集成测试,还是一个端到端测试。
因此TestNG的强大之处在于:
1, 更丰富的annotation。
2, 使用xml配置文件可以任意组合出需要的各种测试。
3, 命令行参数让每一次测试更灵活。
而前面还提到了内嵌Beanshell提供了更多的灵活性,这点之后再继续体会。
功能太多不能一一详述,建议各位还是去看英文版手册。