TestNG 参数化测试实践指南

网站建设4年前发布
92 0 0

作者 | 崔莹峰,审校 | 孙淑娟,参数化测试是TestNG的一个重要特性。 在很多情况下,我们会遇到业务逻辑需要大量测试的场景。 参数化测试允许我们使用不同的值一次又一次地运行相同的测试。, 本文介绍了TestNG 参数化注入的三种不同方式,并在此基础上,介绍了测试代码和测试数据、测试数据和测试环境的分离实践以及一种利用Nacos将测试代码和测试数据维护分离的有效实践。另外,本文将会引导读者完成一个实例,该示例将会较好地演示TestNG 参数的注入方式以及分离测试代码、数据与环境的有效实践。,这里我们使用IDEA 社区版演示本实践全过程,读者也可以使用Eclipse和VSCode参考执行,但笔者并不推荐。,填写项目信息,Language选择Java,Build system选择Maven,JDK选择1.8后,点“Create” 进入工程页面。,pom.xml里加入dependency:,TestNG可以通过如下三种不同的方式将参数直接传递给测试方法:,我们通过在testng.xml定义参数,然后在代码里面可以直接引用。我们先写一个测试用例如下:,编写testng.xml如下:,执行测试。,在testng.xml编辑窗口点击鼠标右键弹出下拉菜单后,从中选择“Run .../src/test/resources/testng.xml”即可执行该单元测试用例。,执行结果如下:,另外我们也可以如下图所示,在ParameterizedTest1类编辑窗口选中需要测试的方法名parameterTest,点击鼠标右键弹出下拉菜单后,从中选择“Run parameterTest()”即可执行该单元测试用例。,但通过如上方式运行单元测试,结果如下:,显然如上方式触发的测试用例不能指定依赖的testng.xml,myName参数没有被初始化,导致测试失败。,使用testng.xml 执行测试的方式适合对测试用例批量执行的场景;如果我们在IDE中只想执行某个具体的测试方法,还是需要从类中触发测试方法的方式,也就是要通过非testng.xml配置的方式解决myName初始化的问题。,解决myName初始化问题的方法一共有两种,其中一种是在测试方法parameterTest输入参数前加@Optional注解,给myName一个默认的初始值如下:,另外就是使用-D命令行参数。,使用-D命令行参数就是让参数以系统参数的方式加载入JVM,该方式支持Java、Maven命令行执行。idea配置-D命令行参数的方式如下:,我们先写一个业务类PrimeNumberChecker如下所示,该类中只有一个方法validate,检查输入参数primeNumber是否为质数,如果是返回True,如果不是返回False。,再写一个测试类PrimeNumberCheckerTest:,在PrimeNumberCheckerTest类编辑窗口选中需要测试的方法名testPrimeNumberChecker,点击鼠标右键弹出下拉菜单后,从中选择“Run testPrimeNumberChecker()”即可执行该单元测试用例。,执行结果如下:,从结果可以看出,该测试用例通过DataProvider一次性注入了5组测试数据。这种特性非常有助于我们在研发过程中采用TDD(测试驱动开发)。关于TDD,并不是本文探讨的内容,这里就不展开了。,基于TestNG参数化注入的方式,我们可以很容易地做到测试代码、数据与环境的相互分离;我们可以统一用文件来管理测试数据,并能灵活地在不同测试环境切换不同的测试数据;我们甚至可以将测试数据文件和测试用例代码进一步分离,各自独立维护,只有在具体执行测试的时候才动态关联。,从测试代码中分离数据,将数据集中写在文件中,文件格式可以用txt、properties、yaml、json等,本文会采用properties格式来做示范,因为这个确实比较简单;但具体到真实研发环境,笔者推荐yaml,yaml格式更方便维护和解读,尤其是需要维护大量数据且有中文字符的场景。,先写一个工具类TestUtils:,再写一个测试类PrimeNumberCheckerTest2:,准备测试数据文件内容,在PrimeNumberCheckerTest2类编辑窗口选中需要测试的方法名testPrimeNumberChecker,点击鼠标右键弹出下拉菜单后,从中选择“Run testPrimeNumberChecker()”即可执行该单元测试用例。,执行结果如下:,从结果可以看出,该测试用例也可以一次性执行5组测试数据。如果需要调整测试数据,只需要直接修改dev.properties就可以了。,写一个测试类PrimeNumberCheckerTest3,该类在PrimeNumberCheckerTest2的基础上做了重构,重构要点如下:,准备测试数据文件内容,在dev.properties文件里新增一行。,执行PrimeNumberCheckerTest3的testPrimeNumberChecker方法,执行结果如下:,显然,我们可以通过-D命令行参数的方式,调整PrimeNumberCheckerTest3的initialize方法的输入参数envName的值,来达到读取类路径下不同properties文件的目的。这一特性对自动化测试非常友好。,在上一个实践中,我们已经做到将测试数据放在了文件中,甚至做到了用同一套测试用例代码基于不同的测试数据文件执行测试,但这些测试数据文件其实还是和代码在一起维护。虽然我们的开发工程师和测试工程师已经能够基于同一个代码库各自维护测试用例代码和测试数据,但如果有必要,我们还是希望开发工程师和测试工程师能够进一步分离,使得测试代码的维护和测试数据的维护工作也相互可以独立。,比如开发工程师写单元测试代码并用自己准备的测试数据进行测试以达到一个准入标准(这个标准因研发团队可异);测试工程师维护测试数据文件,后续测试工程师通过-D命令行切换成自己准备的测试数据文件来执行,生成测试报告和代码覆盖率报告。,将测试代码和测试数据文件维护分离的方式可以有很多种,本文只介绍一种和Nacos结合使用的方式。Nacos是一个微服务注册和发现平台,同时也能作为配置管理中心使用。Nacos支持直接在控制台维护如properties、json、xml、yaml、html和html格式的配置信息,这里我们就把这些配置信息当做测试数据文件即可。,TestUtils里新增initParamFromNacos方法如下:,写一个测试类PrimeNumberCheckerTest4,该类与PrimeNumberCheckerTest3的不同之处只在于:,在Nacos控制台维护测试数据:,Nacos控制台输入如下配置信息,也是测试数据。,执行PrimeNumberCheckerTest4的testPrimeNumberChecker方法,执行结果如下:,如果需要调整测试数据,只需要在Nacos控制台直接操作dataId,操作完毕后点发布就可以了。,本实践主要介绍了TestNG 参数化注入的三种方式,并在此基础上,介绍了测试代码和测试数据、测试数据和测试环境的分离实践以及一种利用Nacos将测试代码和测试数据维护分离的有效实践。TestNG 的参数化特性有助于研发过程实践TDD(测试驱动开发)和自动化测试,对提高代码和工程质量有积极意义。,配套代码下载链接:https://ost.51cto.com/resource/2082,崔莹峰,51CTO社区编辑,一名70后程序员,拥有10多年工作经验,长期从事 Java 开发,架构设计,容器化等相关工作。精通Java,熟练使用Maven、Jenkins等Devops相关工具链,擅长容器化方案规划、设计和落地。

© 版权声明

相关文章