首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

接口测试2

接着上篇,这次引用python自带的测试框架去优化代码,下面我们开始

一、引用unittest测试框架(单一测试用例)

代码示例

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_python.py
# @Time    : 2019/8/17
# @Author  : zhong
# @Blog    : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流  : 3227456102
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest

"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""
# 创建一个类型,执行用例的类,继承unittest的testcase类
class JieKoutest(unittest.TestCase):
    def setUp(self):
        print("setUp")
        pass

    def tearDown(self):
        print("tearDown")
        pass

    # 测试注册接口的函数
    def test_register(self):
        """测试注册接口"""
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        # 因为展示测试的接口没有json,所以只能输出content啦~
        print(r.content)
        print(r.text)

    # 测试登录接口的函数
    def test_login(self):
        """测试登录接口"""
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.post(config.url_login)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)

        print(r.json())
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '裤子男夏季'
        # 获取接口的返回信息
        j = r.json()
        # 输出接口的返回信息
        print(j)
        # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
        # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
        self.assertEqual(expected, j['result'][1][0])
        print(r.text)

if __name__=='__main__':
    # 第一种方式:通过class("test_xxx")来加载测试用例
    # suite = unittest.TestSuite()
    # suite.addTest(JieKoutest("test_register"))
    # suite.addTest(JieKoutest("test_login"))
    # runner = unittest.TextTestRunner()
    # runner.run(suite)

    # 第二种方式:通过makeSuite方式加载测试用例
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(JieKoutest))
    runner = unittest.TextTestRunner()
    runner.run(suite)

    # 第三种方式:通过TestLoader().loadTestsFromTestCase()方式加载测试用例
    # suite1 = unittest.TestLoader().loadTestsFromTestCase(JieKoutest)
    # suite = unittest.TestSuite([suite1])
    # unittest.TextTestRunner().run(suite)

运行结果

代码语言:javascript
复制
D:\python\python3.6.1\python36.exe E:/study/InterfaceTest/interface_python.py
setUp
F200
{'result': [['裤子女2019新款', '5190686.805512066'], ['裤子女夏', '10489290.115309939'], ['裤子男', '10031538.405101819'], ['裤子男夏季', '4436129.512720286'], ['裤子男韩版潮流', '10121279.603580382'], ['裤子女宽松', '5048949.4381212955'], ['裤子女宽松 直筒', '2398009.2506967783'], ['裤子套装女夏时尚', '456376.80136986304'], ['裤子套装夏女', '2056377.6324909746'], ['裤子女显瘦百搭', '1175564.9047796102']]}
{'result': [['裤子女2019新款', '5190686.805512066'], ['裤子女夏', '10489290.115309939'], ['裤子男', '10031538.405101819'], ['裤子男夏季', '4436129.512720286'], ['裤子男韩版潮流', '10121279.603580382'], ['裤子女宽松', '5048949.4381212955'], ['裤子女宽松 直筒', '2398009.2506967783'], ['裤子套装女夏时尚', '456376.80136986304'], ['裤子套装夏女', '2056377.6324909746'], ['裤子女显瘦百搭', '1175564.9047796102']]}
tearDown
setUp
200
b''

tearDown
.
======================================================================
FAIL: test_login (__main__.JieKoutest)
测试登录接口
----------------------------------------------------------------------
Traceback (most recent call last):
  File "E:/study/InterfaceTest/interface_python.py", line 127, in test_login
    self.assertEqual(expected, j['result'][1][0])
AssertionError: '裤子男夏季' != '裤子女夏'
- 裤子男夏季
+ 裤子女夏
----------------------------------------------------------------------
Ran 2 tests in 0.038s

FAILED (failures=1)

Process finished with exit code 0

解析:

可以看出通过unittest框架整理后的代码看起来很清晰,同时也支持多种不同的读取测试用例集以及运行测试用例的方法。

二、引用unittest测试框架(多条测试用例)

1、首先看下目录结构

从目录可以看到,config配置文件单独区分在config文件下,测试用例单独区分放在testcase文件夹下,后续有增加用例可直接添加在testcase文件夹下即可调用使用,interface_python为程序运行的总入口(其中文件夹下的__init__文件是格式自带,默认不做任何修改即可)

2、config.py配置文件:

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: config.py
# @Time    : 2019/8/16
# @Author  : zhong
# @Blog    : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流  : 3227456102

"""(接口代码封装---请求地址与逻辑代码区分之get请求)"""
# baseurl  接口一般分为测试接口和正式接口
# baseurl = 'http://suggest.taobao.com'
#
# # 设定登录接口为baseurl
# url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
#
# # 设定注册接口
# url_register = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
#
# # 设定首页接口
# url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'


"""(接口代码封装---请求地址与逻辑代码区分之post请求)"""
# baseurl  接口一般分为测试接口和正式接口
baseurl = 'http://suggest.taobao.com'

# 设定登录接口为baseurl
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

# 设定注册接口
url_register = {'注册接口': baseurl + '/sug', 'parmras': {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}}

# 设定首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

interface_get_test1.py文件

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_test1.py
# @Time    : 2019/8/16
# @Author  : zhong
# @Blog    : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流  : 3227456102

import requests
from config import config  #  导入config配置文件
import unittest

# 创建一个类型,执行用例的类,继承unittest的testcase类
class Login(unittest.TestCase):
    def setUp(self):
        print("setUp")
        pass

    def tearDown(self):
        print("tearDown")
        pass

    def test_longin(self):
        """测试登录接口"""
        # 发送请求 ,使用config.来调用想要的接口,这里调用首页接口
        r = requests.get(config.url_home)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 进行接口状态码断言 等于200则PASS ,否则为FAIL
        if status == 200:
            print('测试用例PASS')
        else:
            print('测试用例FAIL')
        print(status)
        # 请求的内容
        j = r.json()
        # 判断接口返回内容,存在则PASS,否则为FAIL
        if '裤子男夏季1' in str(j):
            print('存在此数据')
        else:
            print('不存在此数据')
        print(j)

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(Login("test_longin"))
    runner = unittest.TextTestRunner()
    runner.run(suite)

interface_post_test2.py文件

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_post_test2.py
# @Time    : 2019/8/16
# @Author  : zhong
# @Blog    : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流  : 3227456102

import requests
from config import config   # 引入config配置接口的文件
import unittest

# 创建一个类型,执行用例的类,继承unittest的testcase类
class Register(unittest.TestCase):
    def setUp(self):
        print("setUp")
        pass

    def tearDown(self):
        print("tearDown")
        pass

    # 测试注册接口的函数
    def test_register(self):
        """测试注册接口"""
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        # 因为展示测试的接口没有json,所以只能输出content啦~
        print(r.content)
        print(r.text)

    # 测试登录接口的函数
    def test_login(self):
        """测试登录接口"""
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.post(config.url_login)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)

        print(r.json())
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '裤子男夏季'
        # 获取接口的返回信息
        j = r.json()
        # 输出接口的返回信息
        print(j)
        # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
        # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
        self.assertEqual(expected, j['result'][1][0])
        print(r.text)

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(Register("test_register"))
    runner = unittest.TextTestRunner()
    runner.run(suite)

interface_python.py文件

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_python.py
# @Time    : 2019/8/17
# @Author  : zhong
# @Blog    : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流  : 3227456102

import requests
import unittest,time

if __name__=='__main__':
    suite_get = unittest.TestLoader().loadTestsFromNames(['testcase.interface_get_test1'])  # testcase为当前文件名
    suite_post = unittest.TestLoader().loadTestsFromNames(['testcase.interface_post_test2'])  # testcase为当前文件名
    runner = unittest.TextTestRunner()
    runner.run(suite_get)
    runner.run(suite_post)

3、运行结果

代码语言:javascript
复制
D:\python\python3.6.1\python36.exe E:/study/InterfaceTest/interface_python.py
setUp
测试用例PASS
200
不存在此数据
{'result': [['裤子女2019新款', '5110081.801057244'], ['裤子女夏', '10454271.811273694'], ['裤子男', '10068677.046380324'], ['裤子男夏季', '4363835.184022505'], ['裤子男韩版潮流', '10246608.448518991'], ['裤子女宽松', '4966366.141918714'], ['裤子女宽松 直筒', '2417728.3492235206'], ['裤子套装女夏时尚', '709457.3409090909'], ['裤子套装夏女', '2153927.209202013'], ['裤子女显瘦百搭', '1121880.3213848574']]}
tearDown
setUp
.
----------------------------------------------------------------------
Ran 1 test in 0.083s

OK
200
{'result': [['裤子女2019新款', '5110081.801057244'], ['裤子女夏', '10454271.811273694'], ['裤子男', '10068677.046380324'], ['裤子男夏季', '4363835.184022505'], ['裤子男韩版潮流', '10246608.448518991'], ['裤子女宽松', '4966366.141918714'], ['裤子女宽松 直筒', '2417728.3492235206'], ['裤子套装女夏时尚', '709457.3409090909'], ['裤子套装夏女', '2153927.209202013'], ['裤子女显瘦百搭', '1121880.3213848574']]}
{'result': [['裤子女2019新款', '5110081.801057244'], ['裤子女夏', '10454271.811273694'], ['裤子男', '10068677.046380324'], ['裤子男夏季', '4363835.184022505'], ['裤子男韩版潮流', '10246608.448518991'], ['裤子女宽松', '4966366.141918714'], ['裤子女宽松 直筒', '2417728.3492235206'], ['裤子套装女夏时尚', '709457.3409090909'], ['裤子套装夏女', '2153927.209202013'], ['裤子女显瘦百搭', '1121880.3213848574']]}
tearDown
FsetUp
200
b''

tearDown
.
======================================================================
FAIL: test_login (testcase.interface_post_test2.Register)
测试登录接口
----------------------------------------------------------------------
Traceback (most recent call last):
  File "E:\study\InterfaceTest\testcase\interface_post_test2.py", line 59, in test_login
    self.assertEqual(expected, j['result'][1][0])
AssertionError: '裤子男夏季' != '裤子女夏'
- 裤子男夏季
+ 裤子女夏

----------------------------------------------------------------------
Ran 2 tests in 0.049s

FAILED (failures=1)

Process finished with exit code 0

当前运行结果只在编译器中输出,后续增加测试报告输出,并优化测试报告显示(可视化测试报告),以及增加邮件抄送等内容,见下集分解

下一篇
举报
领券