您的当前位置:首页正文

【python实操】python小程序之TestLoader及Fixture

2024-11-29 来源:个人技术集锦

引言

一、TestLoader

1.1 概念

TestLoaderunittest 框架中的一个类,用于从测试模块、测试类或测试方法中加载测试用例。使用 TestLoader 可以更方便地发现和加载测试用例,而不需要手动将每个测试方法添加到 TestSuite

1.1.1 常见的 TestLoader 方法

  • loadTestsFromTestCase(testCaseClass): 从指定的测试类中加载所有测试方法
  • loadTestsFromModule(module): 从指定的模块中加载所有测试类,并从这些类中加载所有测试方法
  • loadTestsFromName(name, module=None): 从指定的名称(可以是模块名、类名或方法名)中加载测试
  • discover(start_dir, pattern='test*.py', top_level_dir=None): 在指定目录及其子目录中查找并加载符合模式的所有测试文件

通过这种方式,你可以更灵活地管理和运行大量的测试用例

1.2 题目

如何使用testloader

1.3 代码

import unittest

suite = unittest.TestLoader().discover('./case', 'testcase*')

# run = unittest.TextTestRunner()
#
# run.run(suite)

unittest.TextTestRunner().run(suite)

输出结果:

1.4 代码解释

使用了 unittest 框架来自动发现并运行测试用例

1.4.1 详细说明

  • TestLoaderdiscover 方法

    • discover 方法会递归地搜索指定目录及其子目录中的测试文件,并根据给定的模式加载这些文件中的测试用例
    • 例如,假设 ./case 目录下有以下结构:
      ./case/
      ├── __init__.py
      ├── testcase1.py
      ├── testcase2.py
      └── subdir/
          ├── __init__.py
          └── testcase3.py
      
    • discover 方法会找到 testcase1.py, testcase2.pysubdir/testcase3.py 中的所有测试用例,并将它们添加到 TestSuite
  • TextTestRunnerrun 方法

    • TextTestRunner 是一个测试运行器,它负责执行测试套件并在控制台上输出结果。
    • run 方法接收一个 TestSuite 对象,并执行其中的所有测试用例
    • 测试结果会显示在控制台上,包括每个测试方法的名称、是否通过以及详细的错误信息(如果有的话)

二、Fixture

2.1 概念

unittest 框架中,测试夹具(Fixture)用于设置和清理测试环境。测试夹具确保每个测试用例在干净、一致的环境中运行,并且在测试完成后可以进行必要的清理工作

  1. setUp 和 tearDown

    • setUp 方法在每个测试方法执行前被调用
    • tearDown 方法在每个测试方法执行后被调用
  2. setUpClass 和 tearDownClass

    • setUpClass 方法在测试类中的所有测试方法执行前被调用一次
    • tearDownClass 方法在测试类中的所有测试方法执行后被调用一次
  3. setUpModule 和 tearDownModule

    • setUpModule 方法在模块中的所有测试类执行前被调用一次
    • tearDownModule 方法在模块中的所有测试类执行后被调用一次

通过合理使用这些夹具方法,可以确保测试环境的一致性和可重复性,从而提高测试的可靠性和稳定性

2.2 题目

如何使用Fixture

2.3 代码

import unittest


class TestLogin(unittest.TestCase):
    def setUp(self):
        print('输入网址......')
    def tearDown(self) -> None:
        print('关闭当前页面......')
    @classmethod
    def setUpClass(cls) -> None:
        print('------1. 打开浏览器')
    @classmethod
    def tearDownClass(cls) -> None:
        print('------5. 关闭浏览器')
    def test_1(self):
        print('输入正确用户名密码验证码,点击登录 1')
    def test_2(self):
        print('输入错误用户名密码验证码,点击登录 2')

输出结果:

2.3 代码解释

这段python代码是使用unittest框架编写的单元测试用例,专门用于测试登录功能。代码中定义了一个测试类TestLogin,该类继承自unittest.TestCase

import unittest

这行代码导入了python标准库中的unittest模块,它是一个用于编写和运行测试的框架

class TestLogin(unittest.TestCase):

这行代码定义了一个名为TestLogin的类,用于包含登录功能的测试用例,它继承自unittest.TestCase

def setUp(self):
    print('输入网址......')

setUp方法是一个特殊的方法,它在每个测试方法执行之前都会被调用。在这个方法中,打印了“输入网址…”,这可能表示设置测试环境或初始化测试所需的步骤

def tearDown(self) -> None:
    print('关闭当前页面......')

tearDown方法也是一个特殊的方法,它在每个测试方法执行之后都会被调用。在这个方法中,打印了“关闭当前页面…”,这可能表示清理测试环境或执行测试后的清理工作

@classmethod
def setUpClass(cls) -> None:
    print('------1. 打开浏览器')

setUpClass是一个类方法,它使用@classmethod装饰器标记。这个方法在所有测试方法执行之前只被调用一次。在这里,它打印了“------1. 打开浏览器”,表示在测试开始前打开浏览器的操作

@classmethod
def tearDownClass(cls) -> None:
    print('------5. 关闭浏览器')

tearDownClass也是一个类方法,它同样使用@classmethod装饰器标记。这个方法在所有测试方法执行之后只被调用一次。它打印了“------5. 关闭浏览器”,表示在所有测试完成后关闭浏览器的操作

def test_1(self):
    print('输入正确用户名密码验证码,点击登录 1')

这是一个测试方法,名为test_1,它测试登录功能的一个方面:输入正确的用户名、密码和验证码,然后点击登录。在这个方法中,它只是打印了相应的操作说明

def test_2(self):
    print('输入错误用户名密码验证码,点击登录 2')

这是另一个测试方法,名为test_2,它测试登录功能的另一个方面:输入错误的用户名、密码和验证码,然后点击登录。同样,这个方法只是打印了相应的操作说明

unittest.main()将会运行TestLogin类中定义的所有测试方法,并按照setUpClasssetUp、测试方法、tearDowntearDownClass的顺序执行

三、思考

3.1 TestLoader

  • ./case 目录中自动发现所有符合 testcase* 模式的测试文件,并运行这些文件中的所有测试用例
  • 测试结果会直接输出到控制台
  • 这是一种非常方便的方式来管理和运行大量的测试用例,而无需手动指定每个测试类或方法

3.2 Fixture

  • setUptearDown方法在每个测试方法执行前后都会被调用
  • setUpClasstearDownClass方法在整个测试类开始前和结束后只被调用一次
  • 测试方法名必须以test开头,这样unittest框架才能识别并运行它们
  • 在实际的测试用例中,通常会有更多的断言(如assertEqual, assertTrue等)来验证测试的结果是否符合预期,而不是仅仅打印操作说明
显示全文