接口自动化(TestNG)
数据驱动概念: 用户输入输出数据来判断测试用例是否通过从而验证需求的测试.
一、接口自动化框架搭建(TestNG数据驱动) ---parameter
关键代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNG" verbose="1">
<parameter name="loginPhone" value="xxx"></parameter>
<parameter name="isMobile" value= "false"></parameter>
<test name="apiTest">
<classes>
<class name="com.demo.Body" />
</classes>
</test>
</suite>
@Test
@Parameters({"loginPhone", "isMobile"})
public static void postLogin(String loginPhone, String isMobile) {

二、data provider 自定义二位对象数组
注意事项: 1、定义DataProvider name, 如果没有定义name属性则匹配二维数组名
2、test annotation 要指定dataProvider name和步骤1 的name值相同
3、数组数据类型要和测试方法参数类型匹配。
官网模板:
//https://testng.org/doc/documentation-main.html
//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
} //This test method declares that its data should be supplied by the Data Provider
//named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
关键代码方法一:
package ddt; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import io.restassured.RestAssured;
import io.restassured.response.Response; public class DataProTest { @DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "loginPhone", "xxxx" },
{ "isMobile", "false" },
};
} @Test(dataProvider = "test1")
public static void postLogin(String loginPhone, String isMobile) {
RestAssured.baseURI = "https://ipassport.damai.cn/newlogin/account/check.do";
RestAssured.basePath = "";
@SuppressWarnings("deprecation"

方法二、
package ddt; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import io.restassured.RestAssured;
import io.restassured.response.Response; public class DataProTest { @DataProvider
public Object[][] createData1() {
return new Object[][] {
{ "loginPhone", "xxxx" },
{ "isMobile", "false" },
};
} @Test(dataProvider = "createData1")
public static void postLogin(String loginPhone, String isMobile) {
四、响应解析-响应状态码、响应头域,响应Cookie
关键代码:
System.out.println("响应状态码:" + String.valueOf(responseCode));
String responseHearder = response.getHeader("token");
System.out.println("响应头域:" + String.valueOf(responseHearder));
String responseCookie = response.getCookie("JSESSIONID");
System.out.println("响应Cookie值:" + String.valueOf(responseCookie));
String responseContent = response.getBody().print();
响应解析Body
//方法一
JsonPath getJsonValue = response.jsonPath();
String nameValue = getJsonValue.get("name");
System.out.println("namevalue: " + nameValue);
//方法二
JsonPath getResponseValue = response.jsonPath();
String value = getResponseValue.get("$.data.file[1].version");
五、请求封装
封装类:
package com.tools; import io.restassured.RestAssured;
import io.restassured.response.Response; public class ApiTool { public static String getWebCookie() {
RestAssured.baseURI = "https://www.douyin.com";
RestAssured.basePath = "/web/api/v2/platform/user/?id=1561475827829";
Response response = RestAssured
.given()
.header("accept",
"application/json, text/plain, */*",
"user-agent",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")
.param("id", "1561475827829").when().log().all().get();
String responseContent = response.getBody().print();
System.out.println(responseContent);
String Cookie = response.getCookie("JSESSIONID");
return Cookie;
} public static Response webGet(String url) {
String cookie = ApiTool.getWebCookie();
Response response = RestAssured.given().cookie("JSESSIONID", cookie)
.when().log().all().post(url);
return response;
} }
实现类
import io.restassured.response.Response;
import org.testng.annotations.Test;
import com.tools.ApiTool;
public class GetHomePageInfo {
@Test
public void getWebHomepage() {
Response response = ApiTool.webGet("www.baidu");
response.getBody().print();
}
}
六、断言
Assert
七、用例管理
从class, method ,group 三个维度,依托功能测试设计按模板、功能点,用例优先级
用例分类运行基础是:解耦
测试一个api的增删改查
如果不解耦,新增失败,会导致后续的删改查用例全部失败
class维度:
method维度:
group维度
接口自动化(TestNG)的更多相关文章
- 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建
1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...
- 接口自动化学习--testNG
一个月一更的节奏~ testNg是一个开源的自动化测试框架..具体那些什么特点的就不想打了- -,贴张图(虽然也看不懂): 学习网站:https://www.yiibai.com/testng 一样是 ...
- Java + maven + httpclient + testng + poi实现接口自动化
一.maven中引入httpclient.testng.poi依赖包 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- python接口自动化(四)--接口测试工具介绍(详解)
简介 “工欲善其事必先利其器”,通过前边几篇文章的介绍,大家大致对接口有了进一步的认识.那么接下来让我们看看接口测试的工具有哪些. 目前,市场上有很多支持接口测试的工具.利用工具进行接口测试,能够提供 ...
- 接口自动化思路_JAVA
写在开头: 技术渣做接口自动化,大神们请轻喷!多提提优化方案和问题点. 以前做接口测试一直通过postman 和 soapUI来做,Postman 是Chrome的一个插件Case多了不好管理,同时执 ...
- 接口自动化学习--mock
好久没有写学习的总结,都正月十二了,但还是要来个新年快乐鸭. 一直都在看imooc的一套java接口自动化实战课程,现在看到了尾部了,然后想到之前那些testng,mock,httpclient等都没 ...
- java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)
简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...
- java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮
1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...
- Python+Pytest+Allure+Git+Jenkins接口自动化框架
Python+Pytest+Allure+Git+Jenkins接口自动化框架 一.接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系. ...
- 基于RestAssured实现接口自动化
RestAssured是一款强大的接口自动化框架, 旨在使用方便的DSL,简化的接口自动化. 下面是基于RestAssured扩展的一个简单框架示例, 先看看用例的风格: package testca ...
随机推荐
- git技能树总结
1. git简介 版本控制: 指的是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制系统发展可分三个阶段:本地版本控制系统 -> 集中式版本控制系统 -> 分布 ...
- django日志集成输出器
在配置文件中 import os # ⽇志 LOGGING = { 'version': 1, # 自定义一个简单版本 'disable_existing_loggers': False, # 是否禁 ...
- Win10使用打印机0x0000011b错误 如何处理(没有KB5005565补丁如何解决??)
1.排查问题 win10连接打印机共享错误显示0x0000011b怎么解决?很多用户在更新了windows系统的最新补丁后,突然发现自己打开打印机的时候提示"无法连接到打印机,错误为0x00 ...
- vue 使用 swiper vue-awesome-swiper
文档地址 https://github.com/surmon-china/vue-awesome-swiper 演示地址 https://v1.github.surmon.me/vue-awesome ...
- C#动态创建对象和其属性
dynamic contact = new ExpandoObject(); contact.Name = "Patrick Hines"; contact.Phone = &qu ...
- [NepCTF2022]中学数学
中学数学 p.q挣扎很久没分解出来,wp出来了赶紧复现试试. 题目 from gmpy2 import * from Crypto.Util.number import * from secret i ...
- vim中的命令行 %! 是啥意思?
:%! command pipes the current file's contents to command's stdin, and replaces the file's contents w ...
- 关于 verilator 中 config.vlt 等配置文件的使用
参考网页:https://verilator.org/guide/latest/exe_verilator.html#configuration-files 注意,在使用 config.vlt 配置文 ...
- 为什么JAVA中(byte)128结果为-128;(byte)-129结果为127
为什么JAVA中(byte)128结果为-128;(byte)-129结果为127 在JAVA中默认的整型为int型,int型占4个字节,为32位.byte占一个字节为8位. JAVA中的二进制都是采 ...
- [node]把静态html挂到node接口下
主要适用于同网段下不同设备查看同一html. 来自知乎. 需要先安装一个node,安装过程不表. 新建文件:nodeServer.js var express = require('express') ...