『心善渊』Selenium3.0基础 — 25、unittest单元测试框架-编程思维

1、unittest基本简介

unittest是Python自带的一个单元测试框架,unittest又被称为PyUnit,是由Java的JUnit衍生而来,基本结构是类似的。对于单元测试,需要设置预先条件,对比预期结果和实际结果。

由于unittest是Python自带的标准模块,所以不需要单独再去安装。引入包import unittest即可使用。

2、unittest基本概念

(1)unittest核心的四个概念

  1. test fixture
    fixture表示test case运行前需要做的准备工作以及结束后的清理工作。比如,创建临时/代理数据库、目录或启动一个浏览器进程。
  2. test case
    test case是单元测试中的最小个体,通常是使用assert方法(断言)检查动作和输入的响应。
    unittest提供了一个基础类TestCase,一般是基于TestCase类进行扩充,来创建test case测试用例。
  3. test suite
    test suite(套件)是test case的合集,通常用test suitetest case按需求汇总后,统一执行。(批量执行用例)
  4. test runner
    test runner是一个执行器,用来执行测试用例或者套件。并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。并提供图形界面、文本界面或者返回一个值展示测试结果。

(2)如何创建一个测试类

所有测试用例类都要继承TestCase基本类。

# 1. 导入unittest
import unittest

# 2. 定义一个测试类
class Test_demo(unittest.TestCase):

(3)test fixture常用的四个方法

1)基于函数级别的方法

  • setup():每个测试方法运行前执行一次。测试类中有多少测试用例执行多少次。
  • teardown():每个测试方法运行完后执行一次。测试类中有多少测试用例执行多少次。

2)基于类级别的方法

  • setUpClass():在测试类执行前执行一次,需要@classmethod装饰器修饰。
  • tearDownClass():在测试类执行完后执行一次,需要@classmethod装饰器修饰。

(4)unittest编写测试方法(用例)规范

  1. py文件需要以test开头。(规范,不必须)
  2. 测试类名称需要Test开头。(规范,不必须)
  3. 每个测试方法名称均以test开头,否则是不被unittest识别的。(规范,必须)
  4. unittest框架中,测试用例就是TestCase的实例,所以每个测试类必须继承unittestTestCase类来编写用例。
  5. 测试方法必须带self参数,用来单独运行或则组合运行用例。
  6. 测试用例的执行顺序是按照测试方法名的ASCII编码字符集的顺序进行排序的。

(5)执行测试脚本

unittest.main():将一个单元测试模块变为可直接运行的测试脚本,main()方法是使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法,并自动执行他们。

执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z

3、unittest入门示例

"""
1.学习目标
    掌握unittest框架下测试用例编写方法
2.操作步骤
    2.1 导入unittest
    2.2 创建测试类
        测试类名称需要Test开头
        继承unittest中的TestCase基本类
        class Test_demo(unittest.TestCase):
    2.3 编写test fixture
        setUp()--前置函数
        tearDown()--后置函数
        setUpClass()--+@classmethod
        tearDownClass()+@classmethod
    2.4 编写test case
        测试方法名称均以test开头
        测试用例执行顺序:按照测试用例名称ASCII字符集编码排序。
        所以我们在执行测试类中的测试方法的时候,要注意测试方法的执行顺序。
3.需求
    编写简单的测试类
"""
# 1 导入unittest
import unittest


# 2 创建测试类
class Test_demo(unittest.TestCase):
    # 3 编写test fixture
    # setUp我们也称之为前置函数
    def setUp(self) -> None:
        print("setUp在每个测试用例执行前先执行。")

    # setUp我们也称之为后置函数
    def tearDown(self) -> None:
        print("tearDown在每个测试用例执行后执行。")

    @classmethod
    # cls等同于self,用于函数和类方便区分。
    def setUpClass(cls) -> None:
        print("setUpClass在测试类执行前先执行。")

    @classmethod
    def tearDownClass(cls) -> None:
        print("tearDownClass在测试类执行后执行。")

    # 4 编写test case
    # 每个测试方法均以test开头,否则是不被unittest识别的。
    def test_case_03(self):
        """测试用例3,这里是测试用例的备注"""
        # 测试方法中,将多行注释写在第一行,就是该方法的备注。
        print("执行测试用例3")

    def test_case_02(self):
        """测试用例2"""
        print("执行测试用例2")

    def test_case_01(self):
        """测试用例1"""
        print("执行测试用例1")


if __name__ == '__main__':
    # 执行当前测试类中,以test开头的所有测试用例
    unittest.main()


"""
输出结果:
setUpClass在测试类执行前先执行。
setUp在每个测试用例执行前先执行。
执行测试用例1
tearDown在每个测试用例执行后执行。
setUp在每个测试用例执行前先执行。
执行测试用例2
tearDown在每个测试用例执行后执行。
setUp在每个测试用例执行前先执行。
执行测试用例3
tearDown在每个测试用例执行后执行。
tearDownClass在测试类执行后执行。
"""

提示:test fixture的四个方法,用到哪个写哪个就好,不用全部都写。

结果说明

测试执行完成后,会打印如下信息

# 运行了3个测试用例,执行的时间
Ran 3 tests in 0.008s

# 执行结果
OK

执行结果有如下三种:

  • OK:表示测试用例全部通过。
  • F:表示测试用例没通过,代码没有问题。
  • E:表示代码有问题。

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/liuyuelinfighting/p/15011122.html