概述:实现接口调用,验证,清理测试数据,输出测试报告
测试地址:
- 商城管理后台(https://litemall.hogwarts.ceshiren.com/)
- 商城客户端(https://litemall.hogwarts.ceshiren.com/vue/index.html#/)
0、引入的包和相关变量:
package com.ceshiren.hogwarts.litermall;
import groovy.transform.VisibilityOptions;
import io.restassured.internal.ResponseLogSpecificationImpl;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import static io.restassured.RestAssured.given;
import static org.junit.jupiter.api.Assertions.assertEquals;
1、token生成接口,获取token;
//获取token
static String requaryToken(){
String paraInfo = "{\"username\":\"admin123\",\"password\":\"admin123\",\"code\":\"\"}";
String token = given()
.contentType("application/json;charset=UTF-8")
.body(paraInfo)
.when().post("https://litemall.hogwarts.ceshiren.com/admin/auth/login")
.then().extract().path("data.token");
return token ;
}
//获取前端token
static String reToken(){
String info = "{\"username\":\"user123\",\"password\":\"user123\"}";
String token = given()
.contentType("application/json")
.body(info)
.when().post("https://litemall.hogwarts.ceshiren.com/wx/auth/login")
.then().extract().path("data.token");
return token;
}
2、通过商品ID删除指定商品方法
static void deleteGoods(String id){
String body = "{\"id\": \"" + id + "\"}";
given()
.contentType("application/json;charset=UTF-8")
.header("X-Litemall-Admin-Token",requaryToken())
.body(body)
.when().post("https://litemall.hogwarts.ceshiren.com/admin/goods/delete")
.then();
}
3、调用目标接口,参数化变量
@ParameterizedTest
@CsvSource({"190006,面皮5","190007,面皮6","190008,面皮9","190009,面皮9"})
void addGoods(String goodsSn,String name){
//调用上架商品接口,上架商品
String parametersInfo = "{\"goods\":{\"picUrl\":\"\",\"gallery\":[],\"isHot\":false,\"isNew\":true,\"isOnSale\":true,\"goodsSn\":\""+goodsSn+"\",\"name\":\""+name+"\"},\"specifications\":[{\"specification\":\"规格\",\"value\":\"标准\",\"picUrl\":\"\"}],\"products\":[{\"id\":0,\"specifications\":[\"标准\"],\"price\":0,\"number\":0,\"url\":\"\"}],\"attributes\":[]}";
given()
.contentType("application/json;charset=UTF-8")
.header("X-Litemall-Admin-Token",requaryToken())
.body(parametersInfo)
.when().post("https://litemall.hogwarts.ceshiren.com/admin/goods/create")
.then().statusCode(200);
// 调用查询商品列表接口,获取商品ID
String parameterInfo = "page=1&limit=20&sort=add_time&order=desc&goodsSn="+goodsSn;
Integer goodIds = given()
.header("X-Litemall-Admin-Token",requaryToken())
.body(parameterInfo)
.when().get("https://litemall.hogwarts.ceshiren.com/admin/goods/list")
.then().extract().path("data.list[0].id");
logger.info("新添加的goodIds为:" + goodIds);
// 查询商品详情接口,获取商品库存ID
int productIds = given()
.header("X-Litemall-Admin-Token",requaryToken())
.param("id",goodIds)
.when().get("https://litemall.hogwarts.ceshiren.com/admin/goods/detail")
.then().extract().path("data.products[0].id");
logger.info("新添加商品的productIds为:" + productIds);
// 调用加入购物车接口,添加购物车
String products = "{\"goodsId\":1109008,\"number\":1,\"productId\":140}";
String errmsg = given()
.header("X-Litemall-Token",reToken())
.contentType("application/json")
.body(products)
.when().post("https://litemall.hogwarts.ceshiren.com/wx/cart/add")
.then().extract().path("errmsg");
logger.info("添加入购物车的信息为:" + errmsg);
assertEquals("成功",errmsg);
deleteList.add(goodIds);
logger.info("清空列表的ID为:" + deleteList.toString());
}
4、调用删除商品方法,清除测试数据
@AfterAll
static void cleanUp(){
//清空测试数据 1、获取 2、保存 3、清除
deleteList.forEach((id) -> {
logger.info("id的值为:" + id);
deleteGoods(id.toString());
});
logger.info("现在deleteList的值为:"+ deleteList);
}
5、pom相关
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-junit5</artifactId>
<version>2.16.1</version>
</dependency>
6、logback.xml
<configuration>
<!-- name指定<appender>的名称 class指定<appender>的全限定名 ConsoleAppender的作用是将日志输出到控制台-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 输出时间格式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}.%M\(%line\) -- %msg%n</pattern>
</encoder>
</appender>
<logger name="com.ceshiren" level="DEBUG" />
<logger name="com" level="WARN" />
<logger name="ceshiren" level="WARN" />
<logger name="org" level="WARN" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>