unittest单元测试框架基本使用

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开头,不然不会被识别"""# 类的初始化@classmethoddef setUpClass(cls) -> None:print("setUpClass")# 类的释放@classmethoddef 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.expectedFailuredef 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)# 案例:判断读取的参数是不是等于jackself.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空间", "微信"))@unpackdef 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:passwith open(report_file_name, 'w') as report:suite.addTests(unittest.TestLoader().loadTestsFromTestCase(ForSkipTest))runner = HTMLTestRunner.HTMLTestRunner(stream=report)runner.run(suite)

个人学习笔记,不足之处多多指教!!!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部