目录
5.3.2 include和exclude标签结合group使用
1. 接口概念
1. 接口并不是java语言中的 Interface.
2. 接口是服务, 用代码实现的一段业务逻辑, 例如,登录接口, 注册接口。
3. 服务可以是任意协议(http, ducco, webservice ), 任意语言的(Java, Python, PHP).
4. 接口测试只需要指定对应协议, 无须关心后台的实现语言。
2. HTTP接口
http接口分为客户端和服务段,客户端发送请求,服务端响应请求。
URL: http://IP: PORT/xx/xx/login
请求方法: POST, GET, DELETE, PUT, PATCH
参数: mobilephone=13212312312 & pwd= 123123123
3. TestNG介绍
TestNG(Test Next Generation, 下一代测试技术)在JUnit和Nunit基础上新增了许多功能。TestNG支持单元自动化测试, 另外,它可以集成selenium, Appium和HttpClient等框架做各种类型的自动化测试。是一个测试框架, 旨在简化从单元测试到集成测试的广泛测试需求。 它提供了一系列丰富的注解(标签), 来帮助我们很方便的编写和管理测试用例和测试方法。
主要特点如下:
1. 强大的注解功能。
2. 数据驱动。
3. 灵活的测试配置。
4. 支持多种并发测试策略。
5. 可以和多种工具(插件)协同使用,如eclipse, IDEA, Maven等。
IDEA安装TestNG插件
test NG依赖
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.11</version>
</dependency>
4. TestNG注解
TestNG和其他很多Java框架(如JUnit, Spring)一样, 使用了大量的注解, 被不同的注解修饰的类,方法具有不同的含义。这里我们将注解分为四类。
1. 前置条件和后置条件
把注解作为前置条件(或初始化操作)和后置条件(或清理操作)使用。
2. 数据驱动
TestNG的特点之一是数据驱动, 即测试用例和测试数据分离,以便于维护和管理。
3. 测试用例
该分类只有一个@Test注解,@Test注解的作用是对测试用例进行控制。
4. 监听器
该分类只有一个@Listeners注解。监听器的作用是控制测试过程,如果采用默认监听器, 则不需要任何配置。如果使用自定义监听器,则需要使用@Listeners注解或者TestNG.xml进行配置。
Test注解
使用此方法注解的类将被TestNG所识别并运行。
属性:
dependsOnMethods: 依赖的方法
alwaysRun: 设置为True时, 无论什么时候都会运行。
description: 代表测试用例描述。
enabled: 设置为false时失效
dataProvider: 数据提供者的名称
4.1 dependsOnMethods标签
dependsOnMethods代表依赖一个或者多个方法,dependsOnGroups代表依赖一个或者多个分组,一旦被依赖的测试用例执行失败,则TestNG将跳过该测试用例。
建议: 尽量不要使用dependsOnMethods或者dependsOnGroups标签,这违背了测试用例需要解耦的原则。
Test注解可以被TestNG识别, 此处,test2的依赖test1,执行顺序是,test1, test2.
@Test
public void test1(){
System.out.println("test1......");
}
@Test(dependsOnMethods = "test1")
public void test2(){
System.out.println("test2......");
}
4.2 alwaysRun标签
1. test2方法的pre-condition(预先)执行条件是执行test1, dependsOnMethods = “test1″。
2. alwaysRun关键字, 设置为false时, 如果pre-condition的值失败,则影响当前方法执行。若pre-condtion的结果为成功时, 则当前方法能顺利通过。
4.2.1 alwaysRun = false
跑test2方法
@Test
public void test1(){
System.out.println("test1......");
assertEquals(true, false);//test会报错
}
@Test (dependsOnMethods = "test1", alwaysRun = false) //先执行test1这个case, alwaysRun=true时候,不管test1成功或者失败都会跑结果
public void test2(){
System.out.println("test2......");
}
结果 : test1断言错误之后, test2不在继续执行
4.2.2 alwaysRun = true
跑test2测试方法
@Test
public void test1(){
System.out.println("test1......");
assertEquals(true, false);//test会报错
}
@Test (dependsOnMethods = "test1", alwaysRun = true) //先执行test1这个case, alwaysRun=true时候,不管test1成功或者失败都会跑结果
public void test2(){
System.out.println("test2......");
}
结果 : test1断言错误之后, test2也继续执行
4.3 description使用
description更像一个说明,对于当前方法业务的描述,或者说在做什么。不会有什么显示结果和影响。在结合测试报告的时候,会显示。
代表测试用例描述,控制台会打印该描述。
@Test (dependsOnMethods = "test1", alwaysRun = true, description = "this is test2")
4.4 enabled标签
1. enabled=false时候,测试用例失效。
2. enabled=true时候,测试用例生效,默认也可以不写enabled.
4.4.1 enabled=true
@Test(enabled = true)
public void test3(){
System.out.println("test3......");
}
结果: 执行成功,enabled = true和默认不写的效果是一致。
4.4.2 enabled = false
enabled = false时候,该测试用例失效,执行时候会跳过。打上enabled=false的情况,我们可以结合实际场景,引发如下思考:
1. 该测试用例永不复用,可以考虑直接删除该测试用例。
2. 该测试用例可能会随着需求变动在次使用,打上enabled = false标签先暂时让这部分测试用例失效,过后恢复需求在改成true,或者去掉enabled标签。
@Test(enabled = false)
public void test3(){
System.out.println("test3......");
}
结果: 没有case执行,本测试用例失效。
4.5 priority标签
priority代表优先级,数字越小,优先级越高,默认值位0,执行顺序为0,1,2……如果级别一样,则执行顺序默认安装方法名排序。
5. TestNG.xml 文件的使用
TestNG.xml文件的作用是控制测试执行的过程,该文件可以使用Eclipse的TestNG插件自动生成。在工程右键-> TestNG-> Convert to TestNG选项,此时会弹出” Refactoring” 对话框,直接单击“Finish” 按钮, 生成testng.xml文件。IDEA如何自动生成我们后续在补充: TBD….
描述: 用来管理测试用例, 运行testNG。
suite: 套件, 项目, 最大。
test: 模块。
classes, class: 测试类。
5.1 TestNG xml 文件示例
这是一个典型的XML文件,第一行包含了XML的声明。<suite>代表一个Suite, <test>代表一个test, <classes>代表可以放多个classs, <class>代表单个class地址。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name ="Suite" parallel="false">
<test name = "test">
<classes>
<class name = "com.testng.Demo"/>
<class name = "com.testng.Demo2"/>
</classes>
</test>
</suite>
5.2 package标签使用
我们可以从5.1的示例中发现, 如果一个class需要一个<class>标签,那么10个class则需要10个<class>标签。如果这些class都在一个package中,则可以使用<package>进行package设置,以简化配置过程。
5.2.1 package标签使用示例
前提条件: 我们将5.1里的demo和demo2都放在com.testng包里。修改testng xml文件, 删除<classes>的标签以及内部配置,并且用包替代。
我们可以发现内容层级和classes, class比较相似,内容层级为<packages>, <package>。包层级可以放多个不同的包。大大提高了效率。运行方法也是一样,Run as -> testNG
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name ="Suite" parallel="false">
<test name = "test">
<packages>
<package name="com.testng"></package>
</packages>
</test>
</suite>
5.3 include和exclude标签
<include>和<exclude>标签的作用是对方法进行设置, <include>代表包含, <exclude>代表排除, 写法上他们都支持争者表达式。
5.3.1 include和exclude标签代码示例
前提: 如我们的Demo类里有这些测试方法,分别是test1(), test2(), test3().
修改testNG xml文件, 删除<package>标签以及内部的配置,并且以方法代替。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name ="Suite" parallel="false">
<test name = "test">
<classes>
<class name="com.testng.Demo">
<methods>
<include name="test."/>
<exclude name="test3"/>
</methods>
</class>
</classes>
</test>
</suite>
执行结果:
test开头的测试方法都会执行,test3被排除在外不会执行。这就是include和exclude标签的作用。
5.3.2 include和exclude标签结合group使用
include和exclude除了在<method>下使用,还可以和groups结合使用,分组运行时使用include和exclude标签。
测试方法如下:
public class Demo7 {
@Test(groups = {"myGroup"})
public void testCase1(){
System.out.println("testCase1......myGroup");
}
@Test
public void testCase2(){
System.out.println("testCase2.......");
}
@Test(groups = {"myGroup"})
public void testCase3(){
System.out.println("testCase3.......myGroup");
}
}
tesgng.xml测试文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="false">
<groups>
<run>
<include name="myGroup"/>
</run>
</groups>
<test name="test">
<classes>
<class name="com.testng.Demo7">
</class>
</classes>
</test>
</suite>
结果
5.4 parameter标签
<parameter>标签和@Parameters注解配合使用,可以对测试用例传递参数,达到数据分离的 效果。
测试类如下
public class Demo8 {
@Parameters({"myParam"})
@Test
public void testCase1(String param) {
System.out.println("myParam is : " + param);
}
}
testng xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="false">
<parameter name="myParam" value="myParamValue"/>
<test name="test">
<classes>
<class name="com.testng.Demo8"/>
</classes>
</test>
</suite>
可以看到,myParam的值通过<parameter>标签和@Parameters注解配合传递给了testCase1.
6. Before/After注解
注解 | 描述 |
@BeforeSuite | 带此注释的方法将在该套件中所有测试运行之前运行 |
@AfterSuite | 带此注释的方法将在该套件中所有测试运行之后运行 |
@BeforeTest | 带此注解的方法将在任何测试方法运行之前运行 |
@AfterTest | 带此注解的方法将在任何测试方法运行之后运行 |
@BeforeClass | 在当前类中第一个测试方法之前运行 |
@AfterClass | 在当前类中所有测试方法之后运行 |
@BeforeMethod | 在每个测试方法之前运行 |
@AfterMethod | 在每个测试方法之后运行 |
6.1 xml和标签类使用例子
DEMO类, 包含各个标签
package com.testng;
import org.testng.annotations.*;
import static org.testng.Assert.*;
/**
* author 大力pig
*/
public class Demo {
@BeforeSuite
public void f1(){
System.out.println("@BeforeSuite......");
}
@AfterSuite
public void f2(){
System.out.println("@BeforeSuite......");
}
@BeforeTest
public void f3(){
System.out.println("@BeforeTest......");
}
@AfterTest
public void f4(){
System.out.println("@AfterTest......");
}
@BeforeClass
public void f5(){
System.out.println("@BeforeClass......");
}
@AfterClass
public void f6(){
System.out.println("@AfterClass......");
}
@BeforeMethod
public void f7(){
System.out.println("@BeforeMethod......");
}
@AfterMethod
public void f8(){
System.out.println("@AfterMethod......");
}
@Test
public void test1(){
System.out.println("Demo test1......");
assertEquals(true, true);//test会报错
}
@Test (dependsOnMethods = "test1", alwaysRun = true, description = "this is test2")
//先执行test1这个case, alwaysRun=true时候,不管test1成功或者失败都会跑结果
public void test2(){
System.out.println("Demo test2......");
}
@Test(enabled = true)
public void test3(){
System.out.println("Demo test3......");
}
}
DEMO2类,不包含各个标签。
package com.testng;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
/**
* author 大力pig
*/
public class Demo2 {
@Test
public void test1(){
System.out.println("Demo2 test1......");
assertEquals(true, true);//test会报错
}
@Test (dependsOnMethods = "test1", alwaysRun = true, description = "this is test2")
//先执行test1这个case, alwaysRun=true时候,不管test1成功或者失败都会跑结果
public void test2(){
System.out.println("Demo2 test2......");
}
@Test(enabled = true)
public void test3(){
System.out.println("Demo2 test3......");
}
}
test.xml文件, 运行两个demo方法。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name ="project" parallel="false">
<test name = "test">
<classes>
<class name = "com.testng.Demo"/>
<class name = "com.testng.Demo2"/>
</classes>
</test>
</suite>
执行结果
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name ="project" parallel="false">
<test name = "test">
<classes>
<class name = "com.testng.Demo5"/>
</classes>
</test>
<parameter name="firstName" value="大力"/>
<parameter name="lastName" value="pig"/>
</suite>
下面对运行结果进行说明:
1. 可以看出@BeforeSuite, @AfterSuite, @BeforeTest, @AfterTest, @BeforeClass 和@AfterClass控制测试的执行力度是不同的, 即Suite> Test > Class.
2. 一个测试用例(@Test修饰的Java方法)可以属于多个多组。
3. @BefoeMethod和@AfterMethod在每个@Test的测试用例前后都会执行。
7. TestNG数据驱动/传递参数
TestNG数据驱动时/ 传递参数有两种方法:
1. Parameters注解。
2. DataProvider注解, 需要xml文件配合。
7.1 Parameters注解
步骤:
1. 定义testNG xml文件, 在文件中添加parameter参数。
2. 新建demo5类, 新建test方法,参数分别位fn和ln, 通过Parameters注解关联参数。
3. 通过testNG xml跑TestNG.
缺点: 自定义传参实现不了, 反复传参存在问题。
7.1.1 testng xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name ="project" parallel="false">
<test name = "test">
<classes>
<class name = "com.testng.Demo5"/>
</classes>
</test>
<parameter name="firstName" value="大力"/>
<parameter name="lastName" value="pig"/>
</suite>
7.1.2 demo 5类和parameters传递参数
两个参数分别对应关系是 firstName-> fn, lastName-> ln.
package com.testng;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
/**
* author 大力pig
*/
public class Demo5 {
@Test
@Parameters({"firstName", "lastName"})
public void test1(String fn, String ln){
System.out.println("demo5......test1......");
System.out.println(fn + "." + ln);
}
}
7.1.3 运行结果
可以由testng控制台看出, lastname=大力 firstname= pig传参成功
7.2 Data provide 传递参数
被@DataProvider修饰的Java方法称为数据提供者, 该方法返回一个对象二维数组, 如果一个测试用例需要该数据,那么就通过@Test注解的dataprovider方法传入数据提供者的名称。
1. Data provide也可以传递参数,功能比parameters传参更加强大。
2. 支持传递多组参数以及类型更复杂的参数。
3. 非常方便的实现数据驱动。
步骤:
1. @DataProvider定义数据源
2. 使用@Test(dataProvider = “datas”)传递参数
7.2.1 Data provide 传递代码演示
package com.testng;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* author 大力pig
*/
public class Demo6 {
@Test(dataProvider = "datas")
public void test1(String fn, String ln){
System.out.println("demo6......test1......");
System.out.println(fn + "." + ln);
}
@DataProvider(name = "datas")
public Object[][] datas(){
Object[][] datas = {
{"大力1","pig1"}, {"大力2", "pig2"}};
return datas;
}
}
8. TestNG测试报告
运行testNG后, 工程中会多一个test-output目录。 展开test-output目录, 在emailable-repprt.html上用鼠标右击,从弹出的快捷键菜单中选择“ Open with -> Web Browser” 选项, 此时可以看到Html格式的测试报告。
除了默认的测试报告外,TestNG还支持与第三方测试报告的集成, 常见的包括ReportNG,Extent Reporting,和Allure等。当然,testNG也支持自定义报告。
今天的文章接口自动化集成TestNG框架分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9894.html