在Java的编程语言中,单元测试框架早期主要使用的为Junit,后面产生了TestNG的单元测试框架,那么具体怎么理解TestNG测试框架了?TestNG测试框架可以理解为下一代单元测试框架。或者更加官方的说,就是:NG代表的是下一代的含义,设计TestNG的灵感来自Junit的设计思想,单元测试框架可用于单元测试,以及自动化测试(UI自动化测试和接口自动化测试),以及集成测试和端到端的测试。TestNG在很短的时间内就得到了普及(目前也是各个公司招聘测试必须要具备的单元测试框架之一的一个框架)。它主要使用Java的注解来配置和编写测试用例。在TestNG的测试框架中,具备了前置测试条件和后置测试条件的处理,依赖性测试,测试分组性的测试,参数化的测试,多线程执行,以及可以和Allure整合后的测试报告,当然它本身就内置了测试报告。TestNG主要是通过XML配置文件来指定被需要执行的测试套件(测试类以及测试方法),默认的情况下,文件名称为testng.xml,当然我们可以自定义成其他的名字,但是我个人建议还是使用默认的名字比较好,这样更加具备通用型。TestNG测试框架的特点可以具体描述为:
- 多个注释前和注释后,当然也可以理解为初始化和清理,作为一个单元测试框架必须得具备这样的功能和设计
- 基于XML文件来配置要被测试的测试用例,XML文件可使用类,套件,以及测试方法等
- 基于组,依据业务特性或者说测试的基本需求,可以把某些一些测试用例分配到一些组中,另外一些分配到其他组来执行
- 依赖性的测试,基于特性的要求,可能测试用例之间执行就会涉及到测试用例执行的依赖性
- 测试方法的参数化,这符合测试驱动的思想,可以在XML文件中配置参数传递给指定的测试方法
- 多线程执行,允许在多个环境中执行自动化测试用例,这主要是应用于并行测试,来提升测试执行的效率
- 测试报告,TestNG内置了测试报告,当然也可以根据自己的诉求来生成比较完整的测试报告,比如结合Allure来生成测试报告
- open Api,TestNG测试框架提供了Open Api,这样可以根据自己的诉求来自定义一些功能
下面具体来演示TestNG的安装以及基本应用,首先我们来创建Maven工程(这地方使用的IDE是IDEA),创建Maven如下所示:
点击Next,填写项目名称以及选择工程目录,在点击Next,显示如下信息:
点击Finish完成,项目创建成功。在pom.xml填写testNG的信息然后自动下载,版本选择6.9.9的版本,pom.xml的文件内容如下
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>ngApp</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.9</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
在如下截图中双击install,如下图所示:
双击后,就会自动下载,本人环境已经安装,所以在信息中缺少下载的信息,完整信息如下所示:
代码语言:javascript复制[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< org.example:ngApp >--------------------------
[INFO] Building ngApp 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ ngApp ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ ngApp ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ ngApp ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Applications/code/workSpace/ngApp/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ ngApp ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ ngApp ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ ngApp ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ ngApp ---
[INFO] Installing /Applications/code/workSpace/ngApp/target/ngApp-1.0-SNAPSHOT.jar to /Users/liwangping/.m2/repository/org/example/ngApp/1.0-SNAPSHOT/ngApp-1.0-SNAPSHOT.jar
[INFO] Installing /Applications/code/workSpace/ngApp/pom.xml to /Users/liwangping/.m2/repository/org/example/ngApp/1.0-SNAPSHOT/ngApp-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.304 s
[INFO] Finished at: 2021-01-01T22:44:40 08:00
[INFO]
在项目中的test中编写测试用例,这里就以selenium为案例,所以还需要引入selenium的信息,最新的pom.xml文件内容为:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>ngApp</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.9</version>
<scope>compile</scope>
</dependency>
<!--WebDriver的测试框架-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
</project>
编写测试代码,测试代码的具体源码为:
代码语言:javascript复制package com.selenium.ui.org;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.testng.Assert;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class BaiduTest
{
WebDriver driver=null;
@BeforeMethod
public void setUp()
{
driver=new ChromeDriver();
driver.get("https://www.baidu.com/");
}
@Test(description = "验证百度首页的title信息准确性")
public void test_baidu_title()
{
Assert.assertEquals(driver.getTitle(),"百度一下,你就知道");
}
@Test(description = "验证百度首页的URL信息")
public void test_baidu_url()
{
Assert.assertEquals(driver.getCurrentUrl(),"https://www.baidu.com/");
}
@Test(description = "验证搜索的关键字的值内容")
public void test_so_value()
{
WebElement element=driver.findElement(By.id("kw"));
String str1="无涯课堂为您服务!";
element.sendKeys(str1);
Assert.assertEquals(element.getAttribute("value"),str1);
}
@AfterMethod
public void tearDown()
{
driver.quit();
}
}
在测试类中,首先需要倒入testng的信息,同时我们在里面新增了它的断言信息,执行测试用例后,它的结果信息如下图所示:
执行后,可以在概述信息里面看到执行的结果信息,主要显示了执行成功的测试用例个数以及失败的,和忽略执行的信息。
在项目中新增testng.xml的文件,文件内容具体为:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--<suite name="UnitSuite">-->
<suite name="Sample Suite">
<test name="Sample test">
<classes>
<class name="com.selenium.ui.org.BaiduTest"></class>
</classes>
</test>
</suite>
在该testng.xml的文件中,指定了执行测试类BaiduTest,选择testng.xml后执行,就会显示执行出的结果信息。