unittest+ddt
unittest
unittest是Python自带的框架
一、为什么选择unittest做自动化测试
单元测试是对单个模块、单个方法进行测试,通常是由开发做,代码测试代码,代码型的测试用例
tester做的测试:Excel写用例,执行用例,人为地判断结果、人为输出测试报告
自动化测试:代码实现测试用例、代码执行用例、代码判断结果,代码生成测试报告
所以,自动化测试可以用unittest框架来做
二、unittest的重要组成
三、继承TestCase类编写测试用例
有固定的语法
1、定义一个测试类,继承了unittest.TestCase
2、在测试类中,以【test_】开头,定义测试函数(测试用例)
3、编写用例:
1、处理测试数据
2、测试步骤
3、断言:预期结果与实际结果进行对比
4、前置后置
四、收集用例
有多种方式:
1、TestSuit()
s = unittest.TestSuit()
1.1添加一个用例
s.addTest(类名(函数名))
1.2添加多个用例
s.addTests([类名(函数名),类名(函数名)])
2、TestLoader()
2.1、通过目录
s=unittest.TestLoader().discover(搜索目录)
#搜索目录中以【test】开头的py文件,
#文件中继承了unittest.TestCase类的测试类,类当中以test_开头的测试函数
2.2、通过类名
s=unittest.TestLoader().loadTestsFromTestCase(测试类名)
2.3、通过模块名
s=unittest.TestLoader().loadTestsFromModule(模块名)
六、运行测试用例并生成结果
也是有多种方式
1、unittest.main() #执行所有用例,没有报告,控制台显示
2、生成HTML测试报告*(常用)*
#先导入:from HTMLTestRunnerNew import HTMLTestRunner
HTMLTestRunner(测试报告路径).run(s)
3、执行容器中的用例,生成Text测试报告
unittest.TextTestRunner().run(s)
4、生成HTML测试报告*(常用)*
#BeautifulReport要另外安装
#先导入:from BeautifulReport import BeautifulReport
br = BeautifulReport(s)
br.report(“测试报告”,“report.html”)
……
还有很多方式
demo代码
```javascript
from common.handle_request import send_requests
from common.handle_excel import HandleFile
from common.handle_path import datas_path,cases_path,reports_path,now
from ddt import ddt,data
import json
import unittest
from HTMLTestRunnerNew import HTMLTestRunner
# get_excel_data()在后续的文章有详细说明
cases = HandleFile(datas_path + "\\login_cases.xlsx").get_excel_data()
@ddt
class TestLogin(unittest.TestCase):
@classmethod
def setUp(self) -> None:
print("=========【测试开始】=每个用例执行开始前都会执行【setUp】=========")
@classmethod
def tearDown(self) -> None:
print("=========【测试结束】=每个用例执行结束后都会执行【tearDown】=========")
@classmethod
def setUpClass(cls) -> None:
print("=========【测试开始】=每个测试类执行开始前都会执行【setUpClass】=========")
@classmethod
def tearDownClass(cls) -> None:
print("=========【测试结束】=每个测试类执行结束后都会执行【tearDownClass】=========")
@data(*cases)
def test_login(self,case):
print("执行第{}条用例:{}".format(case["id"],case["title"]))
# send_requests() 在后续的文章有详细说明
respon = send_requests(case["method"],case["url"],data=case["request_data"])
print("测试结果为:",respon.json())
expect_data = json.loads(case["expect_data"])
try:
self.assertEqual(respon.json()["code"],expect_data["code"])
self.assertEqual(respon.json()["msg"], expect_data["msg"])
except:
print("断言失败")
raise
if __name__ == '__main__':
s = unittest.TestLoader().discover(cases_path + "\\unittest")
with open(reports_path + now + "_report.html", "wb") as fs:
runner = HTMLTestRunner(fs, title="登录测试报告", tester="lintt")
runner.run(s)