标签:年龄 程序 并且 end 直接 value 格式 实现 保存
UnitTest目前是最常用的测试框架之一,主要用于管理测试用例。一开始是用于做单元测试的,现在被开发出来做UI,接口的自动化测试。UnitTest是Python自带的一个测试框架,使用的时候直接引入就可以了
1.测试用例 UnitTest.TestCase
2.前置后置条件setUp()和tearDown()
3.测试套件和运行器UnitTest.TestSuite()和UnitTest.TextTestRunner()
4.断言
如果想用一个类来管理测试用例,只需要将这个类继承UnitTest.TestCase,这个类里面的以 test_ 开头的方法就默认为测试用例,使用unitTest.main()会自动找到TestCase这个类或者他的子类并允许其中红的测试用例,且执行顺序是方法的字符自然顺序排序
import unittest class unitTestDemo(unittest.TestCase): def test_001(self): print("第一个测试用例") def test_003(self): print("第三个测试用例") def test_002(self): print("第二个测试用例") if __name__ == ‘__main__‘: unittest.main() ##----------------------------------------------------------------------- 第一个测试用例 第二个测试用例 第三个测试用例 Ran 3 tests in 0.003s OK
如果加了前置和后置条件
##加在上面代码中 def setUp(self) -> None: print("前置条件") def tearDown(self) -> None: print("后置条件") ----------------------------------------------------------- 前置条件 第一个测试用例 后置条件 前置条件 第二个测试用例 后置条件 前置条件 第三个测试用例 后置条件 Ran 3 tests in 0.006s OK
【前置后置条件的使用】前置和后置条件在所有的用例中都会进行一个环绕效果。那么前置和后置条件其实就可以用来提取每个用例执行前后都需要做的事情,比如浏览器驱动创建,浏览器关闭等。而在测试用例中只处理与用例流程执行相关的代码
import unittest from selenium import webdriver from time import sleep class UnitTestDemo(unittest.TestCase): def test_001(self): self.driver.find_element_by_id("kw").send_keys("unitTest") self.driver.find_element_by_id("su").click() def test_003(self): print("第三个测试用例") def test_002(self): self.driver.find_element_by_id("kw").send_keys("selenium") self.driver.find_element_by_id("su").click() def setUp(self) -> None: sleep(1) self.driver = webdriver.Chrome() self.driver.get("http://www.baidu.com") def tearDown(self) -> None: sleep(3) self.driver.quit() if __name__ == ‘__main__‘: unittest.main()
【@ddt】【@data】可以看到test_001和test_002其实就是在百度搜索不同的内容。代码存在相似性,仅仅数据不同。避免冗余,引入ddt数据驱动测试
import unittest from selenium import webdriver from time import sleep from ddt import ddt, data @ddt class UnitTestDemo(unittest.TestCase): @data("unitTest", "selenium") def test_001(self, text): self.driver.find_element_by_id("kw").send_keys(text) self.driver.find_element_by_id("su").click() def test_003(self): print("第三个测试用例") def setUp(self) -> None: sleep(1) self.driver = webdriver.Chrome() self.driver.get("http://www.baidu.com") def tearDown(self) -> None: sleep(3) self.driver.quit() if __name__ == ‘__main__‘: unittest.main()
【@unpack】这样和之前的效果是一样的,但是可以看到只需一个用例,用@data注解,如果有多个参数,表示这条用例要执行多次不同数据。这是对单参数的情况。但是大多数用例明显参数可能不止一个,再引入unpack
import unittest from selenium import webdriver from time import sleep from ddt import ddt, data, unpack @ddt class UnitTestDemo(unittest.TestCase): @data([‘A‘, ‘B‘], [‘C‘, ‘D‘]) @unpack def test_00A(self, text1, text2): self.driver.find_element_by_id("kw").send_keys(text1) print(text2) self.driver.find_element_by_id("su").click() def test_003(self): print("第三个测试用例") def setUp(self) -> None: sleep(1) self.driver = webdriver.Chrome() self.driver.get("http://www.baidu.com") def tearDown(self) -> None: sleep(3) self.driver.quit() if __name__ == ‘__main__‘: unittest.main()
注意点就是这里data中的参数要用列表表示。并且要引入unpack因为多个列表对应用例个数,列表unpack后才能对应到测试用例方法上的参数
【数据解耦@data_file】
为了实现数据的解耦,甚至可以使用yml文件来做数据保存,并使用@file_data进行数据对接
import unittest from ddt import ddt, data, unpack, file_data @ddt class UnitTestDemo(unittest.TestCase): @file_data("test_003.yml") def test_001(self, **user): print("姓名:{userName},年龄:{userAge}".format(userName=user.get("name"), userAge=user.get("age"))) if __name__ == ‘__main__‘: unittest.main()
------------------------------------------------------------
yml文件如下:
-
name : 张三
age : 12
-
name : 李四
age : 18
被执行测试用例的集合
# 导入unittest模块 import unittest # 继承TestCase类,TestCase类是测试用例类 class Test1(unittest.TestCase): def test_001(self): print(‘001‘) def test_002(self): print(‘002‘) def test_003(self): print(‘003‘) if __name__ == ‘__main__‘: # unittest.main() # 创建测试套件 suit = unittest.TestSuite() # 定义一个测试用例列表 case_list = [‘test_001‘, ‘test_002‘] for case in case_list:
#从Test1类中找到名字为case的用例并加入到测试套件中 suit.addTest(Test1(case)) # 运行测试用例,verbosity=2为每一个测试用例输出报告,run的参数是测试套件 unittest.TextTestRunner(verbosity=2).run(suit)
执行结果:
001
002
test_001 (__main__.Test1) ... ok
test_002 (__main__.Test1) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
标红的就是输出的报告,可以看到哪些用例是ok的,因为没有加断言,所以程序默认执行了没有报错的就是ok的用例
语法很简单,就是self.assertEqual(value1,value2),一般用在selenium中,一系列操作后,获取某个元素的值,并与预期结果对比是否一样。最后会输出如下
#修改上面的用例为如下
def test_002(self):
self.assertEqual(0, 1)
【输出结果】
test_001 (__main__.Test1) ... ok test_002 (__main__.Test1) ... FAIL ====================================================================== FAIL: test_002 (__main__.Test1) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:/Users/31314/PycharmProjects/unitTestProj/1.first_test.py", line 12, in test_002 self.assertEqual(0, 1) AssertionError: 0 != 1 ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1) 001
【生成测试报告HTMLTestRunner】但是如果用例执行完了,报告到控制台明显不可取,所以使用这个HTMLTestRunner可以导出一份html格式的报告
if __name__ == ‘__main__‘:
# unittest.main()
# 创建测试套件
suit = unittest.TestSuite()
# 定义一个测试用例列表
case_list = [‘test_001‘, ‘test_002‘]
for case in case_list:
suit.addTest(Test1(case))
with open("test_report.html", "wb") as f:
HTMLTestRunner(
stream=f,
title="第一份自动生成的测试报告",
description="测试报告是用HTMLTestRunner来实现的",
verbosity=2
).run(suit)
生成的报告如下
标签:年龄 程序 并且 end 直接 value 格式 实现 保存
原文地址:https://www.cnblogs.com/liuyongbo/p/13598153.html