黑马客达天下-接口测试-Postman+Pytest+Allure+Jenkins实现连续集成 ...

打印 上一主题 下一主题

主题 997|帖子 997|积分 2991

目录
项目简介
待测接口
测试流程
计划接口测试用例
合同新增业务
业务路径
剖析接口文档
接口测试用例
接口测试-合同
验证码接口
登录接口
验证码和登录接口关联
新增课程接口
合同上传接口
添加合同接口
合同列表接口
单接口测试
登录接口
提取测试点
计划测试用例
进行测试
断言简化测试
课程添加接口
提取测试点
计划测试用例
查询课程列表接口
提取测试点
计划测试用例
课程修改接口
提取测试点
计划测试用例
课程删除接口
提取测试点
计划测试用例
PostMan
批量实行
断言
相应码断言
包罗指定字符串断言
JSON数据断言
参数化
自定义变量
JSON
CSV
自动化
搭建情况
根本知识
代码实现验证码接口
代码实现登录接口
接口对象封装
代码实现课程新增接口
代码实现合同上传及合同新增接口
代码实现单接口测试-登录接口-JSON实现
自动化集成Allure
集成Jenkins
搭建Newman自动化测试情况
平常陈诉和增强版陈诉
Allure陈诉
通过Jenkins连续集成
自动构建包罗Allure天生陈诉的使命
配置Allure插件
创建使命
Postman使命运行后,postman_Allure使命随之运行


配套资料链接: 百度网盘 请输入提取码
项目简介


项目名称:客达天下项目类型:销售管理系统(CRM)项目特点:前后端分离、功能通用性强项目链接:客达天下/

待测接口



  • 合同管理业务

    • 登录
    • 添加课程
    • 上传合同
    • 新增合同

  • 课程管理模块

    • 添加课程
    • 修改课程
    • 查询课程
    • 删除课程

测试流程


  • 接口文档剖析
  • 计划测试用例
  • 脚本开发
  • 实行脚本
  • 缺陷跟踪
  • 测试陈诉
计划接口测试用例


  • 根据流程图、找出业务路径
  • 根据业务路径分析对应的接口哀求
  • 将业务路径转化为接口测试用例
合同新增业务

合同新增流程图:

业务路径


剖析接口文档




对新增合同接口文档进行分析,通过哀求中的参数(URL、哀求方法、哀求头、哀求参数类型、哀求参数等),计划测试用例
接口测试用例


接口测试-合同

验证码接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/captchaImage
复制代码
实现步骤:

  • 设置哀求方式和接口地址
  • 发送哀求

  • 检察相应结果

登录接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/login
复制代码
实现步骤:

  • 设置哀求方式和接口地址

  • 设置哀求头

  • 设置哀求体

  • 发送哀求
  • 检察相应结果

验证码和登录接口关联

上文可知,登录接口的哀求体中包罗验证码接口的返回值,使用关联技术可以避免手动赋值
需求:

  • 验证码接口:/api/captchaImage
  • 登录接口:/api/login
  • 登录接口哀求体uuid字段->验证码接口返回uuid字段

实现步骤:

  • 创建Environments并添加变量 (此处设置为uuid)

  • 创建Collection并设置情况

  • 添加对应哀求 Image、Login (与上文中验证码接口、登录接口同等)

  • 验证码接口中配置tests

  • 登录接口中使用变量uuid

  • 检察相应结果

   需要先运验证码接口,在运行登录接口
  新增课程接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/clues/course
复制代码
实现步骤:

  • Environments中设置token

  • 登录接口中设置tests

  • 创建对应哀求

  • 发送哀求
  • 检察相应结果

合同上传接口



哀求路径:
  1. http://kdtx-test.itheima.net/api/common/upload
复制代码
实现步骤:

  • 创建对应哀求

  • 发送哀求并检察相应结果

添加合同接口



哀求路径:
  1. http://kdtx-test.itheima.net/api/contract
复制代码
  1. 请求样例:
  2. {
  3.    "name":"测试接口21",
  4.    "phone":"12222222222",
  5.    "contractNo":"HT100120234",
  6.    "subject":"6",
  7.    "courseId":99,
  8.    "channel":"0",
  9.    "activityId":77,
  10.    "fileName":"{{fileName}}"
  11. }
复制代码
实现步骤:

  • Environments中设置fileName

  • 合同上传接口设置Tests

  • 创建添加合同接口并设置对应属性

  • 发送哀求并检察相应结果

合同列表接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/contract/list
复制代码
实现步骤:

  • 创建对应哀求

  • 发送哀求并检察相应结果

单接口测试

登录接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/login
复制代码
需求:


  • 已注册精确的用户名和密码,登录成功
  • 用户名或密码错误,登录失败, 提示"用户名或密码错误"
提取测试点


计划测试用例


进行测试


  • 关联验证码接口(省略)
  • 设置不同的哀求数据登录成功
    登录失败-用户名为空
    登录失败-未注册用户名

  • 发送哀求并检察返回结果登录成功
    登录失败-用户名为空
    登录失败-未注册用户名

断言简化测试

在登录哀求的Tests种添加以下内容:
  1. //断言 状态码为200
  2. pm.test("Status code is 200", function () {
  3.    pm.response.to.have.status(200);
  4. });
  5. //断言数据中包含 "成功"
  6. pm.test("Body matches string", function () {
  7.    pm.expect(pm.response.text()).to.include("成功");
  8. });
  9. //断言json返回数据中的msg值为 "操作成功"
  10. pm.test("Your test name", function () {
  11.    var jsonData = pm.response.json();
  12.    pm.expect(jsonData.msg).to.eql("操作成功");
  13. });
复制代码
发送哀求并检察相应结果:

课程添加接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/clues/course
复制代码
需求:


  • 必填参数


    • 课程名称 (不超过30个字符)
    • 课程学科 (1位数字,0->java,1->前端,6->测试)
    • 课程价格 (1-5位数字)
    • 使用人群 (1位数字,1->小白,2->中级步伐员)

  • 非必填参数


    • 课程介绍 (不超过200个字符)

提取测试点


计划测试用例



查询课程列表接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/clues/course/list
复制代码
需求:


  • 支持课程名称、课程学科、课程价格、适用人群、课程介绍的单条件查询
  • 支持课程名称、课程学科、课程价格、适用人群、课程介绍的组合条件查询
  • 查询存在满足条件课程信息时,返回该课程信息
  • 查询不存在满足条件课程信息时,返回空值
提取测试点


计划测试用例



课程修改接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/clues/course
复制代码
需求:


  • 课程ID (数字、必填)
提取测试点


计划测试用例


课程删除接口


哀求路径:
  1. http://kdtx-test.itheima.net/api/clues/course/id
复制代码
需求:


  • 课程ID (数字、必填)
提取测试点


计划测试用例



PostMan

批量实行

选中需要实行的Collections,点击运行按钮

选择要实行的哀求,点击右侧按钮实行

断言

代替人工自动判断预期结果和实际结果是否同等

相应码断言


包罗指定字符串断言


JSON数据断言


参数化

自定义变量

在Collections界面下的Variables页面卡中可以自定义变量

之后可以使用 {{变量名}} 来使用

JSON

创建json文件,内容如下:
  1. [
  2.     {"username":"manager","password":123456,"status":200,"message":"成功","msg":"操作成功"},
  3.     {"username":"admin","password":"HM_2023_test","status":200,"message":"成功","msg":"操作成功"}
  4. ]
复制代码
使用批量运行的方式,选择创建的json文件


可点击 Preview 按钮进行预览

修改哀求中的Tests (使用data.名称 的情势)

在Body中使用{{变量名}}

批量运行

CSV

创建json文件,内容如下:
  1. username,password,status,message,msg
  2. manager,123456,200,成功,操作成功
  3. admin,HM_2023_test,200,成功,操作成功
复制代码
别的配置同json





自动化

使用工具或代码代替人工对接口进行测试
接口自动化框架计划思路

搭建情况



  • 编程语言:python
  • 测试框架:pytest


  • 接口哀求:requests

安装requests
  1. pip install requests
复制代码
查抄安装:
  1. pip3 show requests
复制代码

根本知识

Requests:

Response:

代码实现验证码接口


  • script文件夹下创建 ImageTest.py文件,添加以下内容
    1. #获取图片验证码
    2. import requests
    3. #导包
    4. import requests
    5. #发送请求
    6. response = requests.get(url="http://kdtx-test.itheima.net/api/captchaImage")
    7. #查看响应
    8. print(response.status_code)
    9. print(response.text)
    复制代码
  • 运行检察结果

代码实现登录接口


  • script文件夹下创建 LoginTest.py文件,添加以下内容
    1. #登录接口
    2. #导包
    3. import requests
    4. #发送请求
    5. url="http://kdtx-test.itheima.net/api/login"
    6. headers={
    7.    "Content-Type":"application/json",
    8. }
    9. loginData={
    10.    "username":"admin",
    11.    "password":"HM_2023_test",
    12.    "code":"2",
    13.    "uuid":"37cb173d9c9245278ed786ce39ff974e"   #运行ImageTest.py得到其中的uuid
    14. }
    15. response = requests.post(url=url,headers=headers,json=loginData)
    16. #查看响应
    17. print(response.status_code)
    18. print(response.text)
    复制代码
  • 运行检察结果


接口对象封装

安装Pytest
  1. pip install pytest
  2. ==7.4.0
  3. 可能还需要以下配置:
  4. pytest
  5. 的测试用例文件名需要以test_命名开头
  6. pycharm导航栏鼠标移入file点击Settings,选择Settings-Tools-Python Integrated Tools,Tesing 下拉框 选 pytest
  7. 点击OK
复制代码

  • 在api文件夹下创建login.py文件,添加以下内容
    1. import requests
    2. # 创建接口类
    3. class LoginAPI:
    4.    # 初始化
    5.    def __init__(self):
    6.        # 指定url基本信息
    7.        self.url_verify = "http://kdtx-test.itheima.net/api/captchaImage"
    8.        self.url_login = "http://kdtx-test.itheima.net/api/login"
    9.    # 验证码
    10.    def get_verify_code(self):
    11.        return requests.get(url=self.url_verify)
    12.    # 登录
    13.    def login(self, test_data):
    14.        return requests.post(url=self.url_login, json=test_data)
    复制代码
  • 在script目录下创建ContracTest.py文件,添加以下内容:
    1. # 导包
    2. from api.login import LoginAPI
    3. # 创建测试类
    4. class TestContract:
    5.    # 初始化
    6.    token = None
    7.    # 前置处理
    8.    def setup(self):
    9.        # 实例化接口对象
    10.        self.login_api = LoginAPI()
    11.    # 后置处理
    12.    def teardown(self):
    13.        pass
    14.    # 1、登录成功
    15.    def test_login_success(self):
    16.        # 获取验证码
    17.        responseImage = self.login_api.get_verify_code()
    18.        print(responseImage.status_code)
    19.        print(responseImage.json())
    20.        # 打印uuid数据
    21.        print(responseImage.json().get("uuid"))
    22.        # 登录
    23.        login_data = {
    24.            "username": "admin",
    25.            "password": "HM_2023_test",
    26.            "code": "2",
    27.            "uuid": responseImage.json().get("uuid")
    28.        }
    29.        res_l = self.login_api.login(test_data=login_data)
    30.        print(res_l.status_code)
    31.        print(res_l.json())
    复制代码
  • 运行检察相应结果

代码实现课程新增接口


  • 在api目录下创建course.py文件,添加以下内容
    1. import requests
    2. # 创建接口类
    3. class CourseAPI:
    4.    # 初始化
    5.    def __init__(self):
    6.        self.url_add_course = "http://kdtx-test.itheima.net/api/clues/course"
    7.        self.url_select_course = "http://kdtx-test.itheima.net/api/clues/course/list"
    8.    # 课程添加
    9.    def add_course(self, test_data, token):
    10.        return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})
    复制代码
  • script目录下ContractTest.py文件添加以下内容
    1. from api.login import LoginAPI
    2. from api.course import CourseAPI
    3. # 创建测试类
    4. class TestContract:
    5.    # 初始化
    6.    token = None
    7.    # 前置处理
    8.    def setup(self):
    9.        # 实例化接口对象
    10.        self.login_api = LoginAPI()
    11.        self.course_api= CourseAPI()
    12.    # 后置处理
    13.    def teardown(self):
    14.        pass
    15.    # 1、登录成功
    16.    def test_login_success(self):
    17.        # 获取验证码
    18.        responseImage = self.login_api.get_verify_code()
    19.        print(responseImage.status_code)
    20.        print(responseImage.json())
    21.        # 打印uuid数据
    22.        print(responseImage.json().get("uuid"))
    23.        # 登录
    24.        login_data = {
    25.            "username": "admin",
    26.            "password": "HM_2023_test",
    27.            "code": "2",
    28.            "uuid": responseImage.json().get("uuid")
    29.        }
    30.        res_l = self.login_api.login(test_data=login_data)
    31.        print(res_l.status_code)
    32.        print(res_l.json())
    33.        TestContract.token=res_l.json().get("token")  #添加token
    34.        print(TestContract.token)
    35.    # 课程新增 方法
    36.    def test_add_Course(self):
    37.        add_data = {"name": "测试开发提升课01", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课01"}
    38.        response=self.course_api.add_course(test_data=add_data,token=TestContract.token)
    39.        print(response.json())
    复制代码
  • 运行检察相应结果

代码实现合同上传及合同新增接口


  • 在config.py文件中添加以下内容
    1. import os
    2. # 设置项目环境域名
    3. BASE_URL = "http://kdtx-test.itheima.net"
    4. # 获取项目根路径
    5. BASE_PATH = os.path.dirname(__file__)
    复制代码
  • 在api目录下创建contract.py文件,添加以下内容
    1. import requests
    2. import config
    3. # 创建接口类
    4. class ContractAPI:
    5.    # 初始化
    6.    def __init__(self):
    7.        self.url_upload = config.BASE_URL + "/api/common/upload"
    8.        self.add_contrat = config.BASE_URL + "/api/contract"
    9.    # 合同上传接口
    10.    def upload_contract(self, test_data, token):
    11.        return requests.post(url=self.url_upload, files={"file": test_data}, headers={"Authorization":  token})
    12.    # 合同新增
    13.    def add_contract(self, test_data, token):
    14.        return requests.post(url=self.add_contrat, json=test_data, headers={"Authorization":  token})
    复制代码
  • 在script目录下的TestContract.py文件中追加下面的内容:
    1. # 导包
    2. from api.login import LoginAPI
    3. from api.course import CourseAPI
    4. from api.contract import ContractAPI
    5. import config
    6. # 创建测试类
    7. class TestContract:
    8.    # 初始化
    9.    token = None
    10.    fileName=None
    11.    # 前置处理
    12.    def setup(self):
    13.        # 实例化接口对象
    14.        self.login_api = LoginAPI()
    15.        self.course_api= CourseAPI()
    16.        self.contract_api = ContractAPI()
    17.    # 后置处理
    18.    def teardown(self):
    19.        pass
    20.    # 1、登录成功
    21.    def test_login_success(self):
    22.        # 获取验证码
    23.        responseImage = self.login_api.get_verify_code()
    24.        print(responseImage.status_code)
    25.        print(responseImage.json())
    26.        # 打印uuid数据
    27.        print(responseImage.json().get("uuid"))
    28.        # 登录
    29.        login_data = {
    30.            "username": "admin",
    31.            "password": "HM_2023_test",
    32.            "code": "2",
    33.            "uuid": responseImage.json().get("uuid")
    34.        }
    35.        res_l = self.login_api.login(test_data=login_data)
    36.        print(res_l.status_code)
    37.        print(res_l.json())
    38.        TestContract.token=res_l.json().get("token")  #添加token
    39.        print(TestContract.token)
    40.    # 课程新增 方法
    41.    def test_add_Course(self):
    42.        add_data = {"name": "测试开发提升课01", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课01"}
    43.        response=self.course_api.add_course(test_data=add_data,token=TestContract.token)
    44.        print(response.json())
    45.    # 上传合同成功
    46.    def test_upload_contract(self):
    47.        self.test_login_success()  # 前置条件:登录
    48.        # 读取pdf文件数据
    49.        # f = open("../data/test.pdf", "rb")
    50.        f = open(config.BASE_PATH + "/data/1.txt", "rb")
    51.        response = self.contract_api.upload_contract(test_data=f, token=TestContract.token)
    52.        TestContract.fileName=response.json().get("fileName")
    53.        print(response.json())
    54.    # 合同新增成功
    55.    def test_add_contract(self):
    56.        self.test_upload_contract()  #前置条件-上传合同
    57.        # contractNo: 数据唯一
    58.        add_data = {"name": "测试888", "phone": "13612345678", "contractNo": "HT20230007", "subject": "6",
    59.                    "courseId": " 99", "channel": "0", "activityId": 77, "fileName": TestContract.fileName}
    60.        response = self.contract_api.add_contract(test_data=add_data, token=TestContract.token)
    61.        print(response.json())
    复制代码
  • 运行检察相应结果
           上传合同需要在data目录下存放对应的文件
       


代码实现单接口测试-登录接口-JSON实现

代码:
  1. from api.login import LoginAPI
  2. import pytest
  3. import json
  4. import config
  5. # # 测试数据
  6. # test_data = [
  7. #     ("admin", "HM_2023_test", 200, '成功', 200),
  8. #     ("", "123456", 200, '错误', 500),
  9. #     ("jack666", "123456", 200, '错误', 500),
  10. # ]
  11. # 读取json文件
  12. def build_data(json_file):
  13.    # 定义空列表
  14.    test_data = []
  15.    # 打开json文件
  16.    with open(json_file, "r",encoding='utf-8') as f:
  17.        # 加载json文件数据
  18.        json_data = json.load(f)
  19.        # 循环遍历测试数据
  20.        for case_data in json_data:
  21.            # 转换数据格式[{},{}] ==> [(),()]
  22.            username = case_data.get("username")
  23.            password = case_data.get("password")
  24.            status = case_data.get("status")
  25.            message = case_data.get("message")
  26.            code = case_data.get("code")
  27.            test_data.append((username, password, status, message, code))
  28.    # 返回处理之后测试数据
  29.    return test_data
  30. # 创建测试类
  31. class TestLoginAPI:
  32.    # 初始化
  33.    uuid = None
  34.    # 前置处理
  35.    def setup(self):
  36.        # 实例化接口类
  37.        self.login_api = LoginAPI()
  38.        # 获取验证码
  39.        response = self.login_api.get_verify_code()
  40.        print(response.json())
  41.        # 提取验证码接口返回的uuid参数值
  42.        TestLoginAPI.uuid = response.json().get("uuid")
  43.        print(TestLoginAPI.uuid)
  44.    # 后置处理
  45.    def teardown(self):
  46.        pass
  47.    # 登录成功
  48.    # @pytest
  49. .mark.parametrize("username, password, status, message, code", build_data(json_file="../data/login.json"))
  50.    @pytest
  51. .mark.parametrize("username, password, status, message, code", build_data(json_file=config.BASE_PATH + "/data/login.json"))
  52.    def test01_success(self, username, password, status, message, code):
  53.        login_data = {
  54.            "username": username,
  55.            "password": password,
  56.            "code": "2",
  57.            "uuid": TestLoginAPI.uuid
  58.        }
  59.        response = self.login_api.login(test_data=login_data)
  60.        # 断言响应状态码为200
  61.        assert status == response.status_code
  62.        # 断言响应数据包含'成功'
  63.        assert message in response.text
  64.        # 断言响应json数据中code值
  65.        assert code == response.json().get("code")
复制代码
运行结果:


自动化集成Allure

下载地址:
  1. GitHub:
  2. https://github.com/allure-framework/allure2/releases
  3. 镜像源:
  4. https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/
复制代码
解压并添加情况变量(bin目录)
检验安装
  1. allure --version
复制代码

配置pytest

.ini文件,添加以下内容:
  1. [pytest
  2. ]
  3. addopts=-s --alluredir report
  4. testpaths=./script
  5. python_files=ContractTest.py
  6. python_classes=Test*
  7. python_functions=test*
复制代码
运行pytest

:(终端中)
  1. pytest
复制代码

然后可以看到report目录下天生了对应日志

天生Allure陈诉:在对应的路径下运行下面命令
  1. allure serve report
复制代码

运行之后会弹出网页,可以看到具体的测试陈诉
   堕落缘故原由:更新及删除的操纵需要指定对应的id,此处并未指定
  





集成Jenkins

   由于postman哀求中使用了断言,而且哀求中包罗接口验证的错误用例,故陈诉中存在的题目均在预期之内
  搭建Newman自动化测试情况

Newman 是一个命令行工具,用于运行 Postman 集合。它答应你在命令行中自动化测试 API,并可以与连续集成和连续摆设(CI/CD)流程集成 相关操纵

首先要安装node.jscmd中实行下面命令 验证是否精确安装:
  1. node -v
复制代码

运行下面命令安装newman:
  1. npm install -g newman
复制代码
之后运行下面命令验证是否精确安装:
  1. newman -v
复制代码

然后导出我们的测试文件

使用cmd进入到测试文件所在目录,运行以下命令
  1. newman run .\Postman.json --reporters cli
复制代码

平常陈诉和增强版陈诉

  1. #导入陈诉模块##平常npm install -g newman
  2. -reporter-html##增强版npm install -g newman
  3. -reporter-htmlextra#运行下面命令 天生陈诉(HTML)newman run Postman.json -r html,htmlextra --reporter-html-export --reporter-html-export html1.html --reporter-htmlextra-export html2.html
复制代码

平常版html

增强版html

会发现:此页面样式错误,缘故原由是引用的js文件在国外解决方法:手动修改对应的js文件
  1. https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css
  2. 修改为
  3. https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.1/css/bootstrap.min.css
复制代码

Allure陈诉

  1. #运行下面命令安装依赖
  2. npm install newman-reporter-allure -g
  3. #运行下面命令生成results
  4. newman run Postman.json --reporters allure --reporter-allure-export allure-results
  5. #运行下面命令查看 报告
  6. allure serve
复制代码

通过Jenkins连续集成

官网:Jenkins/
安装好之后,cmd进入对应文件夹中运行下面命令
  1. java -jar -Dfile.encoding=UTF-8 jenkins.war
复制代码
进入之后,我们点击左侧的新建Item创建使命

输入使命名称、选择 Freestyle project

选中Build perodiaclly 设置以下内容:
  1. #每分钟执行一次
  2. * * * * *
复制代码
Build Steps中选择ExecuteWindowsbatchcommand 来实行我们的cmd命令
  1. call newman run D:\newman\Postman.json --reporters cli
  2. exit 0
复制代码

之后会发现,每分钟都会构建

检察控制台输出可以发现

自动构建包罗Allure天生陈诉的使命

至此,已经实现了定时构建,下面我们实验以下内容:当newman构建时(模仿开发上传新代码等),自动构建包罗Allure天生陈诉的使命
配置Allure插件

网站:Index of /jenkins/plugins/allure-jenkins-plugin/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror/
下载插件之后,进入下面界面安装

选择刚才下载的文件之后,点击摆设

重启Jenkins即可
创建使命

同样的,我们创建新的使命


在构建触发器部分,配置下面的内容

Build Steps部分,我们仍选择windows命令行,输入以下内容
  1. ## call md allure-results 可不加
  2. call newman run D:\newman\Postman.json --reporters cli,allure --reporter-allure-export allure-results
  3. exit 0
复制代码
添加构建后操纵


   留意这两个路径是有要求的,相对于工作目录。
  results目录与上方命令中的目录是同等的,不然会出现陈诉没有数据的情况
  Postman使命运行后,postman_Allure使命随之运行




检察Allure Report陈诉如下


   此处图标为!指测试中有失败样例(与测试用例有关),至此,实现了Jenkins+Allure自动化测试陈诉的连续集成

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表