版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
python unittest模块简单使用
- 1、fixture-TestCase
- 2、TestSuite-TextTestRunner
- 3、TestLoader
- 4、断言
- 5、参数化-parameterized
- 6、跳过-skip
- 7、生成HTML报告
1、 fixture-TestCase
- 定义的类,必须继承TestCase
- fixture属于执行测试函数的前面以及之后处理的代码块
- 类级别
- 函数级别
import unittest
class Test_01(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""
类级别
"""
print("类开始")
def setUp(self):
"""
函数级别
"""
print("函数开始")
def test_01(self):
print("我是测试test_01模块中的:test_01")
def test_02(self):
print("我是测试test_01模块中的:test_02")
def tearDown(self):
"""
函数级别
"""
print("函数结束")
@classmethod
def tearDownClass(cls):
"""
类级别
"""
print("类结束")
if __name__ == '__main__':
unittest.main()
运行结果:
类开始
..
函数开始
我是测试test_01模块中的:test_01
函数结束
----------------------------------------------------------------------
函数开始
Ran 2 tests in 0.000s
OK
我是测试test_01模块中的:test_02
函数结束
类结束
2、TestSuite-TextTestRunner
- TestSuite(测试套件)用于添加多条测试用例-测试类可以存在不同的文件
- 加载指定类中的函数
- 加载类中的所有test开头的函数
- TextTestRunner 用于执行测试用例和测试套件
import unittest
class T1(unittest.TestCase):
def test_01(self):
print("我是T1类中的test_01")
def test_02(self):
print("我是T1类中的test_02")
class T2(unittest.TestCase):
def test_01(self):
print("我是T2类中的test_01")
if __name__ == '__main__':
suite = unittest.TestSuite()
# 类名(函数名)--指定加载函数
suite.addTest(T2("test_01"))
# 类名--加载类中的所有测试函数
suite.addTest(unittest.makeSuite(T1))
runner = unittest.TextTestRunner()
runner.run(suite)
运行结果:
我是T2类中的test_01
...
我是T1类中的test_01
我是T1类中的test_02
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
3、TestLoader
- TestLoader 用来添加测试用例,满足条件的用例
scripts/test_01.py
import unittest
class T1(unittest.TestCase):
def test_01(self):
print("我是T1类中的test_01")
def test_02(self):
print("我是T1类中的test_02")
class T2(unittest.TestCase):
def test_01(self):
print("我是T2类中的test_01")
main.py
import unittest
if __name__ == '__main__':
# start_dir : 测试用例所在的文件夹
# pattern:匹配模式,默认 test*.py
# suite = unittest.TestLoader().discover(start_dir="./scripts", pattern="test*.py")
suite = unittest.defaultTestLoader.discover(start_dir="./scripts", pattern="test*.py")
runner = unittest.TextTestRunner()
runner.run(suite)
运行结果:
我是T1类中的test_01
我是T1类中的test_02
我是T2类中的test_01
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
4、 断言
import unittest
class T1(unittest.TestCase):
def test_01(self):
# msg 不成立则打印
self.assertTrue(True, msg="不是True")
self.assertFalse(False, msg="不是False")
self.assertEqual(1, 1, msg="两个比较数不相等")
self.assertNotEqual(1, 2, msg="两个比较数相等")
self.assertIsNone(None, msg="不为None")
self.assertIsNotNone("123", msg="为None")
# 断言"ab" 在"dafjabc"中
self.assertIn("ab", "dafjabc", msg="在字符串中")
# 断言"abcd" 不在"dafjabc"中
self.assertNotIn("abcd", "dafjabc", msg="不字符串中")
if __name__ == '__main__':
unittest.main()
5、参数化-parameterized
- 安装模块:
pip install parameterized
- 使用
from parameterized import parameterized
import unittest
class T1(unittest.TestCase):
def setUp(self):
print("函数开始")
@parameterized.expand([(1, 2, 3), (11, 22, 33), (111, 222, 333)])
def test(self, a, b, c):
print(a, b, c)
if __name__ == '__main__':
unittest.main()
- 结果
函数开始
1 2 3
函数开始
11 22 33
函数开始
111 222 333
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
6、 跳过-skip
import unittest
class T1(unittest.TestCase):
temp = 10
def test(self):
print("test--->")
@unittest.skip("暂时不执行该函数")
def test1(self):
print("test1--->")
# True,则跳过,第一个参数bool值,第二个说明
@unittest.skipIf(temp > 2, "temp大于2时跳过")
def test2(self):
print("test2--->")
# False 跳过
@unittest.skipUnless(temp > 2, "temp小于2时跳过")
def test3(self):
print("test3--->")
if __name__ == '__main__':
unittest.main()
运行结果:
.ss.
test--->
----------------------------------------------------------------------
Ran 4 tests in 0.000s
test3--->
OK (skipped=2)
7、 生成HTML报告
- 报告下载地址-使用说明
复制BeautifulReport文件夹到 python安装目录的/site-packages/ - scripts/test_01.py
import unittest
class T1(unittest.TestCase):
def test_01(self):
print("我是T1类中的test_01")
def test_02(self):
print("我是T1类中的test_02")
class T2(unittest.TestCase):
def test_01(self):
print("我是T2类中的test_01")
- 1、初次使用
新建report文件夹
import unittest
from BeautifulReport import BeautifulReport
if __name__ == '__main__':
suite = unittest.defaultTestLoader.discover(start_dir="./scripts",pattern="test*.py")
result = BeautifulReport(suite)
# filename -> 测试报告名称, 如果不指定默认文件名为report.html
# description -> 测试报告用例名称展示
# log_path='.' -> log文件写入路径
result.report(filename="测试报告",description="测试deafult报告",log_path='report')
运行结果:
- 2、添加用例描述-报错的信息点击用例展开即可查看
import unittest
import time
from BeautifulReport import BeautifulReport
from selenium import webdriver
class T3(unittest.TestCase):
def test_01(self):
"""
我是test_01函数
"""
print("我是T3中的test_01函数")
def test_02(self):
"""
我是test_02函数
"""
print("我是T3中的test_02函数")
# 断言失败,信息收集在html的展开中
self.assertEqual(1,2)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(T3("test_01"))
suite.addTest(T3("test_02"))
result = BeautifulReport(suite)
result.report(filename="测试报告",description="测试deafult报告",log_path='report')
运行结果:
- 3、断言失败-自动截图(前提实现save_img函数)
- 在当前目录创建img目录存储图片
- 当前目录report存储报告
import unittest
from selenium import webdriver
from BeautifulReport import BeautifulReport
class T3(unittest.TestCase):
""" 测试T3"""
def save_img(self, img_name):
"""
保存图片
"""
self.driver.get_screenshot_as_file('{}/{}.png'.format("./img", img_name))
@BeautifulReport.add_test_img('百度首页')
def test_01(self):
"""
打开首页, 截图
"""
self.driver = webdriver.Chrome()
self.driver.get("http://www.baidu.com")
# 断言失败
self.assertEqual(1,2)
self.driver.quit()
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(T3("test_01"))
result = BeautifulReport(suite)
result.report(filename="测试报告", description="测试deafult报告", log_path='report')
- 4、没有断言-需要添加图片-可以在函数中调用save_img
- 小Bug,如果只添加一个图片,则会发现测试报告中没有图片(所以在一个测试用例中添加两个图片以上)
import unittest
from selenium import webdriver
from BeautifulReport import BeautifulReport
class T3(unittest.TestCase):
def save_img(self, img_name):
"""
保存图片
"""
self.driver.get_screenshot_as_file('{}/{}.png'.format("./img", img_name))
@BeautifulReport.add_test_img('百度首页', "百度首页点击新闻按钮")
def test_01(self):
"""
打开首页截图,点击新闻链接截图
"""
self.driver = webdriver.Chrome()
self.driver.get("http://www.baidu.com")
self.save_img('百度首页')
self.driver.find_element_by_xpath("//*[@id='u1']/a[1]")
self.save_img('百度首页点击新闻按钮')
print('跳转与保存截图完成')
self.driver.quit()
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(T3("test_01"))
result = BeautifulReport(suite)
result.report(filename="测试报告", description="测试deafult报告", log_path='report')