1、unittest介绍
- Python单元测试框架,基于erichgamma的JUnit和kentbeck的Smalltalk测试框架(经许可使用)。
- 此模块包含核心框架类,这些类构成特定的测试用例和套件(TestCase、TestSuite等),以及用于运行测试和报告结果的基于文本的实用程序类(TextTestRunner)。
2、unittest常用方法
- 1、TestCase(测试用例):所有的测试用例的基类,一个test case 包括正常执行的用例,其中包括setup(用例的开始),tearDown(用例的结束),以及run(用例的执行器)。
import unittest
# 通过继承unittest.TestCase来实现用例
class ForTest(unittest.TestCase):
"""
测试用例必须使用test开头,不然不会被识别
"""
# 类的初始化
@classmethod
def setUpClass(cls) -> None:
print("setUpClass")
# 类的释放
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass")
def add(self, a, b):
print(a + b)
# 初始化
def setUp(self) -> None:
print("初始化")
# 释放
def tearDown(self) -> None:
print("释放")
# 测试用例
def test_a(self):
print("------------a--------------")
# 测试用例
def test_b(self):
self.add(9, 10)
print("------------b--------------")
if __name__ == '__main__':
unittest.main(verbosity=2)
- 2、TestSuite(测试套件):多个测试用例的组合就是测试套件,TestSuite可以嵌套TestSuite。
- 3、TextTestRunner:是来执行测试用例的,其中的run(suite)会执行TestSuite/TestCase中的run(suite)方法。
# encoding: utf-8
import os
import unittest
from UnitTest_study.for_test05 import ForSkipTest
from HTMLTestRunner import HTMLTestRunner
# 创建一个suite对象,相当于一个容器,刚开始创建的时候是一个空的
suite = unittest.TestSuite()
# 向suite容器中添加测试用例
suite.addTest(ForSkipTest('test_1'))
suite.addTest(ForSkipTest('test_2'))
suite.addTest(ForSkipTest('test_3'))
runner = unittest.TextTestRunner()
runner.run(suite)
- 4、TestLoder:是用来加载 TestCase到TestSuite中,其中有几个loadTestsFrom_()方法,就是从各个地方寻找TestCase,创建他们的实例,然后add到TestSuite中,再返回一个TestSuite实例
# encoding: utf-8
import os
import unittest
from UnitTest_study.for_test05 import ForSkipTest
from HTMLTestRunner import HTMLTestRunner
# 创建一个suite对象,相当于一个容器,刚开始创建的时候是一个空的
suite = unittest.TestSuite()
# 运行某一个路径下边的测试脚本
test_dir = './'
discover = unittest.defaultTestLoader.discover(start_dir=test_dir,pattern="for_test*.py")
# 运行某一个类的所有测试用例
# suite.addTests(unittest.TestLoader().loadTestsFromTestCase(ForSkipTest))
# 根据名称执行测试用例
suite.addTests(unittest.TestLoader().loadTestsFromName('for_test05.ForSkipTest'))
runner = unittest.TextTestRunner()
runner.run(suite)
- 5、@unittest.skip()相关用法,判断执行测试案例
from ddt import ddt, data
import unittest
@ddt
class ForSkipTest(unittest.TestCase):
# 无条件跳过执行该测试用例
@unittest.skip("我不想执行,就是任性")
def test_1(self):
print("test1")
# 有条件跳过@unittest.skipIf(<条件满足跳过>,<不满足信息>)
@unittest.skipIf(2 > 1, "我满足条件,所以我跳过了")
def test_2(self):
print("test2")
# 有条件执行跳过操作@unittest.skipIf(<条件不满足跳过>,<不满足信息>)
@unittest.skipUnless(2 > 1, "不满足条件,我跳过了")
def test_3(self):
print("test3")
# 如果该用例执行失败,不计入case数中
@unittest.expectedFailure
def test_4(self):
print("test4")
def test_5(self):
print("test5")
self.assertEqual(4, 3, msg="notEqual")
if __name__ == '__main__':
unittest.main()
- 6、TestFixture:一个测试用例的初始化准备及环境还原,主要是setUp() 和 setDown()方法
- 7、assert断言的使用
import yaml
from ddt import ddt,file_data
import unittest
@ddt
class ForTestDemo(unittest.TestCase):
@file_data('a.yml')
def test_demo1(self,**kwargs):
name = kwargs.get('name')
print(name)
# 案例:判断读取的参数是不是等于jack
self.assertEqual(name,"jack",msg="not found")
print(kwargs.get('age'))
if __name__ == '__main__':
unittest.main()
列举出来了断言的部分方法(具体使用论情况而定)
4、ddt的使用(当需要测试多组数据的时候可以使用ddt配合unittest)
import time
from selenium import webdriver
import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class ForClassTest(unittest.TestCase):
# @classmethod
# def setUpClass(cls) -> None:
# print("start")
#
# @classmethod
# def tearDownClass(cls) -> None:
# print("end")
#
# def setUp(self) -> None:
# self.driver = webdriver.Chrome()
# self.driver.get("https://www.baidu.com")
# self.driver.implicitly_wait(10)
#
# def tearDown(self) -> None:
# time.sleep(5)
# self.driver.quit()
# 使用ddt中的data可以对多组数据进行测试
@data("csdn", "QQ空间", "博客园")
def test_web(self, text):
self.driver.find_element_by_id('kw').send_keys(text)
self.driver.find_element_by_id('su').click()
# 每一组有多个参数时,使用元祖形式,配合@unpack使用
@data(("csdn", "博客园"), ("QQ空间", "微信"))
@unpack
def test_a(self, text1, text2):
print(text1)
print(text2)
# 从文档中获取测试参数
"""a.yml
-
name: "Jack"
age: 18
-
name: "Java"
age: 20
-
name: "Python"
age: 19
"""
@file_data('a.yml')
def test_a(self,**kwargs):
print(kwargs.get('name'))
print(kwargs.get('age'))
if __name__ == '__main__':
unittest.main()
4、HTMLTestRunner的使用
- HTMLTestRunner:与Python单元测试框架一起使用的TestRunner。它生成一个HTML报告,以一目了然地显示结果。
# encoding: utf-8
import os
import unittest
from UnitTest_study.for_test05 import ForSkipTest
from HTMLTestRunner import HTMLTestRunner
# 创建一个suite对象,相当于一个容器,刚开始创建的时候是一个空的
suite = unittest.TestSuite()
report_path = "./report"
report_file_name = report_path + "report.html"
if os.path.exists(report_path):
os.mkdir(report_path)
else:
pass
with open(report_file_name, 'w') as report:
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(ForSkipTest))
runner = HTMLTestRunner.HTMLTestRunner(stream=report)
runner.run(suite)