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开头,不然不会被识别
    """

    # 类的初始化
    @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)

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值