技术选型
- Python3.7 或 3.8
- unittest -- ⾃带
- requests
- 发送 http 请求
- pip install requests
- HTMLTestRunner -- ⽣成测试报告
- Fiddler -- 抓包⼯具
- Pycharm 社区版集成开发环境 -- 下载地址
unitest
- Python 单元测试框架,类似于 java 的 JUnit 框架 官网
- unittest 核⼼ -- TestFixture、TestCase、TestSuite、TestRunner
注意
- 所有类中⽅法的⼊参为 self,定义⽅法的变量也要“self.变量;
- 定义测试⽤例,以“test”开头命名的⽅法,⽅法的⼊参为 self;
- unittest.main()⽅法会搜索该模块下所有以 test 开头的测试⽤例⽅法,并⾃动执⾏它们;
- ⾃⼰写的 py ⽂件不能⽤ unittest.py 命名,不然会找不到 TestCase;
- ⽤例成功是输出 . 失败是 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)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于