接口自动化测试 (python)

本贴最后更新于 1546 天前,其中的信息可能已经时移世异

rsz 软件测试.jpg

技术选型

  • Python3.7 或 3.8
  • unittest -- ⾃带
  • requests
    • 发送 http 请求
    • pip install requests
  • HTMLTestRunner -- ⽣成测试报告
  • Fiddler -- 抓包⼯具
  • Pycharm 社区版集成开发环境 -- 下载地址

unitest

  • Python 单元测试框架,类似于 java 的 JUnit 框架 官网
  • unittest 核⼼ -- TestFixture、TestCase、TestSuite、TestRunner

注意

  1. 所有类中⽅法的⼊参为 self,定义⽅法的变量也要“self.变量;
  2. 定义测试⽤例,以“test”开头命名的⽅法,⽅法的⼊参为 self;
  3. unittest.main()⽅法会搜索该模块下所有以 test 开头的测试⽤例⽅法,并⾃动执⾏它们;
  4. ⾃⼰写的 py ⽂件不能⽤ unittest.py 命名,不然会找不到 TestCase;
  5. ⽤例成功是输出 . 失败是 F;

快速开发⼀个例⼦

# -*- coding: UTF-8 -*-
import unittest
class UserTestCase(unittest.TestCase):
 def setUp(self):
 print(" set up 开始")
 def tearDown(self):
 print("tearDown 执⾏结束")
 def testCase1(self):
 print("test case1")
 def testCase2(self):
 print("test case2")
if __name__ == '__main__':
 unittest.main()

断⾔

self.assert* -- 文档

方法与注解

setUp()

# 每个⽤例执⾏前都会执⾏
def setUp(self):

tearDown()

# 每个⽤例执⾏后都会执⾏
def tearDown(self):

setUpClass()

# 执⾏所有⽤例前只运⾏⼀次
@classmethod
def setUpClass(cls):

tearDownClass()

# 执⾏所有⽤例后只运⾏⼀次
@classmethod
def tearDownClass(cls):

unittest.skip()

# 跳过某个测试⽤例
@unittest.skip("跳过这个测试")

verbosity

# verbosity -- 日志级别 默认是1
# 0 -- 最简洁,不输出每个⽤例执⾏结果
# 2 -- 输出⽤例的详细执⾏结果
unittest.main(verbosity=2)

TestSuite()

  • ⽤来确定测试⽤例的顺序,哪个先执⾏哪个后执⾏;
  • 如果⼀个 class 中有四个 test 开头的⽅法,则加载到 suite 中时则有四个测试⽤例;
  • 由 TestLoder 加载 TestCase 到 TestSuite;
  • 调⽤ addTest 来加载测试⽤例 -- 类名('⽅法名')的集合
    • addTest() 添加⼀个测试⽤例
    • addTest([,,])添加多个测试⽤例
if __name__ == '__main__':
 # verbosity 默认是1,为0的话最简洁,不输出每个⽤例执⾏结果,2 输出⽤例的详细执⾏结果
 # unittest.main(verbosity=2)
 # 构造⼀个测试套件
 suite = unittest.TestSuite()
 # 类名('⽅法名')的集合
 suite.addTest(UserTestCase2("testCase3"))
 suite.addTest(UserTestCase("testCase2"))
 suite.addTest(UserTestCase2("testCase2"))
 # 批量添加
 suite.addTests([UserTestCase2("testCase3"),UserTestCase2("testCase2"),UserTestCase("testCase2")])
 # 执⾏测试TextTestRunner()⽂本测试⽤例运⾏器,通过该类下⾯的run()⽅法来运⾏suite所组装的测试⽤例,⼊参为suite测试套件
 runner = unittest.TextTestRunner(verbosity=2)
 # run()⽅法是运⾏测试套件的测试⽤例,⼊参为suite测试套件
 runner.run(suite)

TestLoader()

⽤例加载器,我们可以通过把⽤例都存放在这⾥,然后再通过 Suite 进⾏批量执⾏,但⽆法对 case 进⾏排序

if __name__ == '__main__':
  # 构造测试套件
  suite = unittest.TestSuite()
  # 实例化loader
  loader = unittest.TestLoader()
  # 加载 UserTestCase 下的全部⽤例
  suite.addTests(loader.loadTestsFromTestCase(UserTestCase))
  suite.addTests(loader.loadTestsFromTestCase(UserTestCase2))
  runner = unittest.TextTestRunner(verbosity=2)
  runner.run(suite)

discover

批量加载⽂件夹⽤例

  • case_dir -- 待执⾏⽤例的⽬录
  • pattern -- 这个是匹配脚本名称的规则,test*.py 意思是匹配 test 开头的所有脚本
  • top_level_dir -- 这个是顶层⽬录的名称,⼀般默认等于 None 就⾏
# -*- coding: UTF-8 -*-
import unittest
import os
def load_all_case():
  """加载指定路径的全部测试⽤例"""
  # print(os.getcwd())
  # ⽤例路径,case是⽂件名称
  case_path = os.path.join(os.getcwd(),"case")
  # print(case_path)
  discover = unittest.defaultTestLoader.discover(case_path, pattern="*Case.py",top_level_dir=None)
  return discover
if __name__ == '__main__':
  runner = unittest.TextTestRunner()
  runner.run(load_all_case())

requests

python 需要发起⽹络请求,在标准库中 urllib2 模块已经包含了平常我们使⽤的⼤多数功能,但是它的 API 使⽤起来让⼈感觉不太好.⼤神开发了 Requests 模块,继承了 urllib2 的所有特性,⽀持 HTTP 连接保持和连接池,⽀持使⽤ cookie 保持会话,⽀持⽂件上传等,本质就是封装了 urllib3. 相关文档

安装

pip install requests

快速使⽤ (包模块命名不能⽤ http)

# -*- coding: UTF-8 -*-
import requests
response = requests.get("请求的URL地址")
print(response.text)

常用的 API

响应内容

  • http 状态码 -- response.status_code
  • 使⽤ response.text
Requests会基于HTTP响应的⽂本编码⾃动解码响应内容,⼤多数Unicode字符集都能正常解码.
  • 使⽤ response.content
返回的是服务器响应数据的原始⼆进制字节流,⼀般⽤来保存图⽚等⼆进制⽂件
  • 使⽤ response.json()

get 请求带参数请求

# 构建请求参数
data = {"video_id": 53}
response = requests.get("请求的URL地址", data)

post 请求带参数请求

# 构建请求参数
data = {"phone": "13910423314", "pwd":"1234567890"}
response = requests.post("请求的URL地址", data=data)
# 注意点: post提交⽅式有两个传参⽅式,针对不同的content-type,务必要指定接⼝是哪个类型,表单提交还是json提交
# Content-Type : application/x-www-form-urlencoded -- requests.post("url", data=data)
# Content-Type : application/json -- requests.post("url", json=data)

请求增加 Header 信息

headers = {"token":"获取的token值"}
# get带请求头信息
response = requests.get("请求的URL地址", headers=headers)
# post带请求头信息
response = requests.post("请求的URL地址", data={"id":99}, headers=headers)

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...