python学习笔记-17. unittest测试框架



文章目录

  • python学习笔记-17. unittest测试框架
  • 前言
  • 一、unittest简介
  • 二、unittest的简单使用
  • 1. unittest常用方法
  • 2. unittest的case执行
  • 三、测试结果分析
  • 总结



前言

unittest通常用于单元测试
python常见的几种单元测试框架

  • unittest
  • pytest
  • nose
  • mock

一、unittest简介

unittest介绍:
unittest是python自带的单元测试框架,在自动化测试中提供用例的管理与执行,提供丰富的判断方法,可以配合HTMLTestRunner生成html的测试报告

unittest编写规范:

  • 测试模块首先需要导入模块,import unittest
  • 测试类必须继承unittest.TestCase
  • 测试方法必须以“test_”开头
  • 模块名字和类名没有特殊要求

提供了test cases, test suites, test fixtures, test runner 相关组件

二、unittest的简单使用

1. unittest常用方法

常用方法:

  • setUpClass: 所有用例执行开始之前需要执行的方法,为类方法,定义时需要@classmethod注解,执行在setUp之前
  • tearDownClass: 所有测试用例执行完成后需要执行的方法,为类方法,定义时需要@classmethod注解,执行在tearDown之后
  • setUp:每个测试用例开始之前执行的方法
  • tearDown:每条测试用例执行完成后需要执行的方法
  • test_caseName:test_开头的方法为测试用例
  • @unittest.skip: 放在对应的用例上方进行跳过用例
import unittest


# 测试的类需要继承unittest.TestCase

class demo(unittest.TestCase):

    # 作用在所有测试用例执行之前
    @classmethod
    def setUpClass(cls) -> None:
        print("this is setup class")

    # 作用在所有测试用例执行之后
    @classmethod
    def tearDownClass(cls) -> None:
        print("this is tearDown class")

    # setUp 通常用于编写测试开始前的准备工作,作用在每条测试用例前面
    def setUp(self) -> None:
        print("this case setup")

    # 测试执行完成后进行资源的释放操作,作用在每条测试用例结束后
    def tearDown(self) -> None:
        print("this is teardown")

    # 定义测试用例,注意需要test_格式进行定义
    def test_case001(self):
        print("testcase001")
        # assertEqual方法,比较第一个参数和第二个参数是否相等,不相等执行打印第三个参数的信息
        self.assertEqual(1, 1, "判断相等")
        # assertIn判断是否包含
        self.assertIn('a', 'apple')
        # assertNoIn反向判断是否包含
        self.assertNotIn('a', 'this')

    def test_case002(self):
        print("testcase002")
        # assertEqual方法,比较第一个参数和第二个参数是否相等,不相等执行打印第三个参数的信息
        self.assertEqual(1, 1, "判断相等")
        # assertIn判断是否包含
        self.assertIn('a', 'apple')
        # assertNoIn反向判断是否包含
        self.assertNotIn('a', 'this')

    def test_case003(self):
        print("testcase003")
        # assertEqual方法,比较第一个参数和第二个参数是否相等,不相等执行打印第三个参数的信息
        self.assertEqual(1, 1, "判断相等")
        # assertIn判断是否包含
        self.assertIn('a', 'apple')
        # assertNoIn反向判断是否包含
        self.assertNotIn('a', 'this')


if __name__ == '__main__':
    unittest.main()

unittest常用断言:

  • assertEqual
  • assertIn
  • assertTrue

2. unittest的case执行

  1. 使用unittest.main(): 运行当前模块,所有以test_开头的测试用例
  2. 使用suite执行:
  • suite = unittest.TestSuite()
  • suite.addTest(TestMethod(“test_case001”))
  • suite.addTest(TestMethod(“test_case002”))
  • unittest.TextTestRunner().run(suite)
  1. 使用TestLoader方法,添加类
  2. 匹配某个目录下所有test开头的py文件,执行这些文件下的所有测试用例

使用unittest.main()执行

import unittest


class demo(unittest.TestCase):
	def test_case001(self):
		print("this is test_case001")

	def test_case002(self):
		print("this is test_case002")


class demo1(unittest.TestCase):
	def test_case003(self):
		print("this is test_case001")

	def test_case004(self):
		print("this is test_case002")

if __name__ == '__main__':
    unittest.main()

使用suite执行测试用例

import unittest


class demo(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("this is class setUp")

    @classmethod
    def tearDownClass(cls) -> None:
        print("this is class tearDown")

    def setUp(self) -> None:
        print("this is setUp")
    def tearDown(self) -> None:
        print("this is tearDown")
    def test_case001(self):
        print("this is test_case001")

    def test_case002(self):
        print("this is test_case002")


class demo1(unittest.TestCase):
    def test_case003(self):
        print("this is test_case003")

    def test_case004(self):
        print("this is test_case004")

if __name__ == '__main__':
    suite = unittest.TestSuite()
    # suite中添加测试用例
    suite.addTest(demo("test_case001"))
    suite.addTest(demo1("test_case003"))
	# 运行suite
    unittest.TextTestRunner().run(suite)

执行结果

this is class setUp
this is setUp
this is test_case001
this is tearDown
this is class tearDown
this is test_case003
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

使用TestLoader方法

import unittest


class demo(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("this is class setUp")

    @classmethod
    def tearDownClass(cls) -> None:
        print("this is class tearDown")

    def setUp(self) -> None:
        print("this is setUp")
    def tearDown(self) -> None:
        print("this is tearDown")
    def test_case001(self):
        print("this is test_case001")

    def test_case002(self):
        print("this is test_case002")


class demo1(unittest.TestCase):
    def test_case003(self):
        print("this is test_case003")

    def test_case004(self):
        print("this is test_case004")


class demo2(unittest.TestCase):
    def test_case005(self):
        print("this is test_case005")

    def test_case006(self):
        print("this is test_case006")

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(demo)
    suite1 = unittest.TestLoader().loadTestsFromTestCase(demo2)
    suite_all = unittest.TestSuite([suite, suite1])
    unittest.TextTestRunner().run(suite_all)

匹配test*.py执行测试用例

# 获取当前目录下,所有test开头的文件,discover方法后面第一个参数为匹配目录,第二个参数为匹配表达式
discover = unittest.defaultTestLoader.discover("./", 'test*.py')
unittest.TextTestRunner().run(discover)

三、测试结果分析

htmltestrunner

下载htmltestrunner:https://codeload.github.com/huilansame/HTMLTestRunner_PY3/zip/refs/heads/master

pychar打开项目:

python 单元测试框架 python的unittest框架_学习

在test.py中定义了报告生成的相关代码

import unittest
from HTMLTestRunner_PY3 import HTMLTestRunner

if __name__ == '__main__':
	# 定义报告title
    report_title = 'Example用例执行报告'
    # 定义报告的描述
    desc = '用于展示修改样式后的HTMLTestRunner'
    # 定义报告生成的文件名称
    report_file = 'ExampleReport.html'
	
	# 使用unittest创建测试套件,然后使用addTest方法添加测试用例
    testsuite = unittest.TestSuite()
    testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(TestTest))
    testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(ExampleCase1))
    testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(ExampleCase2))
    testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(ExampleCase3))

    with open(report_file, 'wb') as report:
    	# 使用HTMLTestRunner,执行并生成测试报告
        runner = HTMLTestRunner(stream=report, title=report_title, description=desc)
        runner.run(testsuite)

总结

测试用例执行过程:

  1. 编写测试用例,即test_case_name
  2. 由TestLoader加载TestCase到TestSuite中
  3. 由TextTestRUnner运行TestSuite
  4. 运行结果保存到TextTestResult中
  5. 整个过程集成在unittest.main模块中
  6. TestCase和TestSuite都可以是多个