接口实践-电子商城接口自动化测试实战

概述:实现接口调用,验证,清理测试数据,输出测试报告
测试地址:

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>