版本
- Python3.7
- Unittest 自带版本
- HtmlTestRunner 优化版(开源)
HtmlTestRunner安装方法
-
pip install html-testRunner
安装完直接可以调用 - 优化版本:手动下载地址,如果是利用Anaconda安装python的需要将下载的HTMLTestReportCN.py和HTMLTestReportEN.py文放在\anaconda\Lib\下供调用。参考博客
实际操作
Pycharm环境下使用
- 创建project,选择系统的env
- 创建API文件夹,在此文件夹下创建CaseOne.py文件
- 选择
http://httpbin.org/
网站作为测试网站(任打任挨的网站) - 程序:
import unittest
import requests
from requests import exceptions
from HTMLTestReportCN import HTMLTestRunner #1.导入第三方报表库
import sys
#2.继承unittest.TestCase类 --》同时 继承了其断言和setUpClass、setUp、tearDownClass、tearDown
class MyTest(unittest.TestCase):
# 3.此方法是测试用例执行前调用,初始化,例如连接数据库、登录网址保持session
# 同时还有setUp()方法,二者区别是前者是所有用例开始前初始化一次,后者是每个test都会初始化一次
@classmethod
def setUpClass(cls):
print("excute")
def test_Get(self): #4.测试get发送数据到网址是否成功,返回的数据是包含发送的数据则成功
url = "http://httpbin.org/get"
formdata = {
"user": "yu",
"method": "get"
}
try:
res = requests.get(url, params=formdata) #这里用params 不要用data
res.encoding = res.apparent_encoding
if res.status_code == 200:
resp = res.json()# 返回的是字典 若使用res.text需要用json.loads()转成字典
except exceptions.RequestException as e:
raise "error %s" % e
sys.exit(1)
self.assertIn("user", list(resp["args"].keys()), msg="user没有返回,实际返回的是{}".format(resp))#断言1
self.assertIn("method", list(resp["args"].keys()), msg="user没有返回,实际返回的是{}".format(resp))#断言2
def test_Post(self):#5.测试post发送数据到网址是否成功,返回的数据是包含发送的数据则成功
url = "http://httpbin.org/post"
formdata = {
"USER": "YU",
"METHOD": "GET"
}
try:
res = requests.post(url, params=formdata) # params和data
res.encoding = res.apparent_encoding
if res.status_code == 200:
resp = res.json()# 返回的是字典 若使用res.text需要用json.loads()转成字典
except exceptions.RequestException as e:
raise "error %s" % e
sys.exit(1)
self.assertIn("USER", list(resp["args"].keys()), msg="user没有返回,实际返回的是{}".format(resp))#断言1
self.assertIn("METHOD", list(resp["args"].keys()), msg="user没有返回,实际返回的是{}".format(resp))#断言2
# 6.此方法是测试用用例结束清理环境,例如退出连接数据库、退出登录网址保持session
# 同时还有tearDown()方法,二者区别是前者是所有用例结束时清理一次,后者是每个test都会清理一次
def test_Equal(self):
self.assertEqual(3, 1+1, msg="1+1=3?")
@classmethod
def tearDownClass(cls):
print("test over")
if __name__ == "__main__":
unittest.main(verbosity=2) #在unittest.main()中加 verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果,即没有上面的结果中的第1行;如果设为 2,则输出详细的执行结果,如下:
-
以上程序执行输出:
-
这个输出其实是pytest框架执行测试用例时候的输出端,pycharm默认直接调用了pytest,因为我早就安装了pytest,没装应该是调用unittest的框架输出
-
修改环境,换成unittest的
-
方法一,修改系统默认的测试框架,直接修改(注意:测试文件第一次运行是用什么环境,即使修改了后面还是会用第一次运行的环境):
-
方法二,设置运行时候的框架:
-
step1:编辑一个要用的测试环境
-
step2:
-
step3:这样选
-
step4:改名字,选文件
-
step5:执行
-
step6:查看新的报告
-
同样的测试文件的不同输出:
-
注意:按照上述方法,选择普通模式才能生成html报表,选择其他框架模式都不可以
-
使用HTMLTestRunner生成报表,修改代码:
if __name__ == "__main__":
print("执行了if————namme")
# unittest.main(verbosity=2) #使用套件不要用这执行
f = open("F:\\pythonFiles\\UnittestTry\\API\\report.html", "wb")
suit = unittest.TestSuite()#测试套件 一个组的测试用例
suit.addTest(MyTest("test_Get"))
suit.addTest(MyTest("test_Post"))
suit.addTest(MyTest("test_Equal"))
runner = HTMLTestRunner(stream=f, title="test",description="第一个报表")
runner.run(suit)
f.close()
- 执行输出:
其中.
表示通过,F
表示执行不通过
- 生成报表
其他扩展或注意事项
- 命令行运行
-
python -m unittest test_1.py test_2.py
测试多个模块 -
python -m unittest test_1.TestClass
测试某个测试类 -
python -m unittest test_1.TestClass.test_method
测试某个测试方法 -
python -m unittest -v test_module
显示详细结果 -
python -m unittest -h
帮助
-
- 所有测试方法名称需要以
test
开头,测试类需要Test
开头 - 常见断言:msg错误说明,自己定义
-
assertEqual(self, first, second, msg=None)
判断两个参数相等 -
assertNotEqual(self, first, second, msg=None)
判断两个参数不相等 -
assertIn(self, member, container, msg=None)
判断是字符串是否包含 -
assertNotIn(self, member, container, msg=None)
判断是字符串是否不包含 -
assertTrue(self, expr, msg=None)
判断是否为真 -
assertFalse(self, expr, msg=None)
判断是否为假 -
assertIsNone(self, obj, msg=None)
判断是否为None -
assertIsNotNone(self, obj, msg=None)
判断是否不为None - unittest常见断言方法
-
- Test fixtures:
- fixture表示tests运行前需要做的准备工作以及结束后的清理工作。比如,创建临时/代理数据库、目录或启动一个服务器进程
- Text Suite:
- test suite是test case的合集,通常用test suite将test case汇总然后一起执行
- test runner:
- test runner是一个执行器,它可以执行case并提供结果给用户。它可以提供图形界面、文本界面或者返回一个值表示测试结果。
- 更多内容