在python中测试应用

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【6月更文挑战第29天】本文介绍Python的unittest是内置的单元测试框架,适合线性控制流的代码测试。并举实例说明,如何组织测试代码,如何构造脚手架和测试套件。

1 简介

python测试类似JUnit,包含测试用例(TestCase)、套件(TestSuite)和TextTestRunner。测试方法以test_开头。例如:

```python
import unittest

class TestIntegerArithmetic(unittest.TestCase):
def test_add(self):
    self.assertEqual(1 + 2, 3)

def test_multiply(self):
    self.assert

测试用例可以通过setUptearDown方法准备和清理环境。
通过unittest.main()运行测试,
命令行接口如python -m unittest [options] tests
探索性测试使用discover,信号处理允许捕获中断。unittest提供全面功能,Go更注重并发性能。

mandala曼德罗符号.png

2 经典方式:Py的测试

Python的内建框架名为unittest,它非常适合测试具有相当线性控制流的代码。
基本上是按面向对象的编程方式一步一步的假设和拆除套件。

  • 组织方式简介

    py内置测试包为 unittest, 测试套件与 go 的xUnit 级别层次类似,测试包,测试模块,测试类(包括测试套件设置),测试用例。

    它基于 JUnit的启发。 这个模块包含的核心框架类支持 测试用例和套件的基础架构 例如 TestCase TestSuite。
    并且提供运行测试和基于文本类的执行报告(TextTestRunner) 。

    一个最基础的例子,用例始终以test 开头

     #//test_module
     import unittest
    
    class IntegerArithmeticTestCase(unittest.TestCase):
        def testAdd(self):  
            self.assertEqual((1 + 2), 3)
            self.assertEqual(0 + 1, 1)
        def testMultiply(self):
            self.assertEqual((0 * 10), 0)
            self.assertEqual((5 * 8), 40)
    
    if __name__ == '__main__':
        unittest.main()
    

    只要在 main 函数中声明了unittest.main(),这将被解析为测试模块,以下方式 执行它

      python   -m unittest test_module
    

    3 实例:测试脚手架和套件

    • 脚手架

      对应每个级别都可用有设置不同层次的套件,例如下,设置fixture,可以称之为脚手架,
      在setup中 从环境中读取ip信息,以便在执行用例时做为全局的信息依据。

      并在此时获得日志处理对象logger:

      class TestCase(unittest.TestCase):

         def __init__(self, method_name):
             unittest.TestCase.__init__(self, method_name)
      
         def setUp(self):
      
           self.ip = os.getenv('ip') 
           self.logger = logger
      
         def tearDown(self):
      
           self.logger.info("===== Teardown Section of %s =====" % self.__class__.__name__)
      
    • 测试套件处理

    这里只有简单的 成功和失败两类,如果case有更多共性,比如校验名称长度,也可以在这里做为套件处理。

      class RpcTest(TestCase):
    
        def successTest(self, rpc, method='POST', jsons=None):
            resp = rpc.Request(  jsons, method)
            if resp['message'] != 'true':
                self.assertEqual(resp['message'], True, msg=(resp, True))
            else:
                self.assertEqual(resp['message'], 'true', msg=(resp, 'true'))
            return resp
    
      def failTest(self, rpc, params, errorCode, errorMessage=None, jsons=None, method='POST'): 

          resp = rpc.Request(params=params, jsons=jsons, method=method)
          if resp['code'] != errorCode:
              self.assertEqual(resp['code'], errorCode, msg=(resp, errorCode))
          else:
              self.assertEqual(resp['code'], errorCode)
          return resp

      def nameScopeTest(...):
         ...
  • 用例设置

    在具体用例中执行套件设置时,比如开始时清理环境,DB信息设置等等。 比如在结束后清理环境,还原DB,环境信息等等。

    并且其内部包,在某些特殊的场景,比如环境所属地址ip 为内部环境,不需要执行失败的校验,则可选择跳过。

    class RpcBaseTest(RpcTest):

     scope = 'rpc'
     scopeIp = self.ip
     condition = self.CheckScope(self.ip)
    
     @classmethod
     def setUpClass(cls):
    
         cls.successCode = 200
         self.logger.info("test setup")
    
     def testPing(self):
         self.SuccessTest(...)
    
     @unittest.skipIf(condition=condition, reason=scopeIp)
     def testPingFail(self):
         self.FailTest(...)
    
     @classmethod
     def setTearDown(cls):
    
        cls.ClearDB()
        self.logger.info("test tear down")
    

    相对而言,因为py发展历史长久充分,单测包 提供的功能比较全面。 go 的功能稍微差一些,但是在性能校验中有更多支持。

    执行的命令行接口指令类似于 go

    python -m unittest
    python -m unittest test_module1 test_module2
    python -m unittest test_module.TestClass
    python -m unittest test_module.TestClass.test_method

    更多的功能包括探索性测试和信号处理。

    • 探索性测试
      在 TestLoader.discover() 中实现,但也可以通过命令行使用。它在命令行中的基本用法如下:

      cd project_directory
      python -m unittest discover

    • 信号处理 它提供了捕获中断行为(control-C)时的选项。
      因此允许测试继续并报告结果,但是多次中断将退出执行。

      python -m unittest -c/--catch

      该命令行选项。 它提供了测试运行期间处理 control-C 的更友好方式。

4 小结

综上,在python中 单元测试 unittest是一种经典的实现方式。
而go更注重并发性能的调试,也是其优点。

  • 在py中unittest包括以下主要信息:

    1 脚手架:test fixture

     test fixture 表示为了开展一项或多项测试所需要进行的准备工作脚手架,以及所有相关的清理操作。
     举个例子,这可能包含创建临时或代理的数据库、目录,再或者启动一个服务器进程。
    

    2 用例:test case

      一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应。 
      unittest 提供一个基类: TestCase ,用于新建测试用例。
    

    3 套件:test suite

      test suite 是一系列的测试用例,或测试套件,或两者皆有。它用于归档需要一起执行的测试。
      诸如: setUp(),tearDown(), setUpClasee(), tearDownClass(). setUpModule(), tearDownModule()
    

    4 执行器:test runner

      test runner 是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。
    
目录
相关文章
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
282 1
|
3月前
|
监控 安全 Shell
管道符在渗透测试与网络安全中的全面应用指南
管道符是渗透测试与网络安全中的关键工具,既可用于高效系统管理,也可能被攻击者利用实施命令注入、权限提升、数据外泄等攻击。本文全面解析管道符的基础原理、实战应用与防御策略,涵盖Windows与Linux系统差异、攻击技术示例及检测手段,帮助安全人员掌握其利用方式与防护措施,提升系统安全性。
176 6
|
2月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
180 0
|
3月前
|
数据采集 监控 Java
Python 函数式编程的执行效率:实际应用中的权衡
Python 函数式编程的执行效率:实际应用中的权衡
258 102
|
2月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
440 11
|
2月前
|
机器学习/深度学习 算法 安全
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
173 6
|
3月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
210 18
|
2月前
|
设计模式 缓存 运维
Python装饰器实战场景解析:从原理到应用的10个经典案例
Python装饰器是函数式编程的精华,通过10个实战场景,从日志记录、权限验证到插件系统,全面解析其应用。掌握装饰器,让代码更优雅、灵活,提升开发效率。
204 0
|
3月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
233 0
|
3月前
|
存储 程序员 数据处理
Python列表基础操作全解析:从创建到灵活应用
本文深入浅出地讲解了Python列表的各类操作,从创建、增删改查到遍历与性能优化,内容详实且贴近实战,适合初学者快速掌握这一核心数据结构。
375 0

推荐镜像

更多