Fork me on GitHub

【unittest】unittest基础01

一、什么是unittest

unittest是Python单元测试框架,类似于JUnit框架。

unittest中有4个重要的概念:test fixture、 test case、 test suite,、test runner 

Testcase:一个TestCase的实例就是一个测试用例(包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。

Test suite:多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

Test runner:其中的run(test)会执行TestSuite/TestCase中的run(result)方法。

Test fixture:对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现

TestLoader:是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

二、简单用法

unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的。基本用法如下:

1.用import unittest导入unittest模块

2.定义一个继承自unittest.TestCase的测试用例类,如class xxx(unittest.TestCase):

3.定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。

4.定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。

5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。

6.调用unittest.main()启动测试

三、unittest模块的常用方法

assertEqual(a, b)     a == b

assertNotEqual(a, b)     a != b

assertTrue(x)     bool(x) is True

assertFalse(x)     bool(x) is False

 

实例展示01:

import unittest
class TestSample(unittest.TestCase):
    #类共享的fixture,在整个测试类开头执行一次
    @classmethod
    def setUpClass(cls):
        print('整个测试类只执行一次 --start')

    #测试用例fixture
    def setUp(self):
        print('每给测试开始前执行一次')

    #测试用例默认以test开头
    def test_equal(self):
        self.assertEqual(1,1)
    def test_not_equal(self):
        self.assertNotEqual(1,0)

    #测试用例fixture
    def tearDown(self):
        print('每个测试结束后执行一次')

    #整个测试列结束执行一次
    @classmethod
    def tearDownClass(cls):
        print('整个测试类只执行一次 --End')


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

 

实战参考代码:

新建lagouTest项目:

 

 

 itesting_test代码:

import unittest
class ITestingTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("整个测试类支持一次 --start")
    def setUp(self) -> None:
        print('整个测试开始前执行一次')

    # 测试用例默认以test开头
    def test_equal(self):
        self.assertEqual(1, 1)

    def test_not_equal(self):
        self.assertNotEqual(1, 0)

    # 测试用例fixture
    def tearDown(self):
        print('每个测试结束后执行一次')

    # 整个测试列结束执行一次
    @classmethod
    def tearDownClass(cls):
        print('整个测试类只执行一次 --End')

 

test_to_run代码参考:

import unittest
class TestToRun(unittest.TestCase):
    def setUp(self) -> None:
        #setUp()方法,通常打开浏览器,初始化API请求或者准备测试数据
        pass

    def testAssertNotEqual(self):
        #这里具体的测试方法,此处只是演示
        self.assertEqual(1,2)
    def testAssertEqual(self):
        self.assertEqual(1,1)
    def tearDown(self) -> None:
        #定义测试后的清理动作
        pass

  

main.py文件:

解析tests文件夹,手动查找并加载测试用例到测试套件

import os
import unittest
import importlib.util
#解析tests文件夹并且返回module的字符列表
def get_module_name_string(file_dir):
    return_list=[]

    for root,dirs,file in os.walk(file_dir):
        #root 所指的是当前正在遍历的这个文件夹的本身的地址
        #dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
        #file 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
        for i in file:
            if not (i.endswith('__init__.py') or i.endswith('.pyc'))  and  i.startswith('test'):
                f=os.path.join(root,i)
                mod ='tests.' + f.split('\\tests\\')[1].replace('.py','')
                return_list.append(mod)
        return return_list



if __name__ == '__main__':
    #定义suite测试套件
    suites=unittest.TestSuite()
    #使用package.mod方式获取所有模块的string
    #os.path.join(os.path.dirname(__file__) 获取当前目录
    mod_sting_list=get_module_name_string(os.path.join(os.path.dirname(__file__),'tests'))
    print(mod_sting_list)
    #遍历每一个mod string 先导入再把他加入测试用例
    for mod_string in  mod_sting_list:
        print(mod_string)
        #m为对应的test用例文件目录
        m =importlib.import_module(mod_string)
        #测试加载器TestLoader
        test_case =unittest.TestLoader().loadTestsFromModule(m)
        #添加测试用例到测试套件
        suites.addTest(test_case)
    #runner测试运行器,指定runner为TextTestRunner
    runner=unittest.TextTestRunner(verbosity=2)
    #运行suite
    runner.run(suites)

 

动态加载文件

if __name__ == '__main__':
    #动态查找测试用例文件
    loader =unittest.defaultTestLoader
    #生成测试suite
    #os.path.join(os.path.dirname(__file__) 起始文件位置,top_level_dir必须指定
    suite=loader.discover(os.path.join(os.path.dirname(__file__),'tests'),pattern='test*.py',top_level_dir=None)
    #runner测试运行器,指定runner为TextTestRunner
    runner=unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

 

执行结果展示(两种方式结果一样):

 

 

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2022-03-03 23:02  橘子偏爱橙子  阅读(139)  评论(0编辑  收藏  举报