在python中测试应用

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
应用实时监控服务-应用监控,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 【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 是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。
    
目录
相关文章
|
30天前
|
数据采集 监控 Java
Python 函数式编程的执行效率:实际应用中的权衡
Python 函数式编程的执行效率:实际应用中的权衡
196 102
|
1月前
|
机器学习/深度学习 自然语言处理 API
query改写:大模型应用测试离不开的实践
queryrewrite 是一个用于大模型应用测试的 Python 库,专注于查询(query)的改写与验证。它支持多种改写方法,包括大型语言模型(LLM)、词汇表替换和同义词替换,同时提供多种验证方法如 ROUGE-L、BLEU、帕累托最优和LLM语义相似度,以确保改写后的查询在语义上保持一致。该项目特别优化了对中文文本的处理,涵盖分词和相似度计算。用户可通过 pip 安装,并支持扩展不同的 LLM 模型,如 OpenAI、Ollama 等。
368 87
query改写:大模型应用测试离不开的实践
|
1月前
|
JSON 自然语言处理 算法
大模型应用测试必备技能:问题对生成实践
本文介绍了利用LangChain的QAGenerationChain从文本生成问题-答案对(QA pairs)的方法,旨在解决LLM应用开发中测试数据生成的格式不统一、库版本过时、模型输出异常及代码可维护性差等问题。文中提供了完整的代码实现,并对生成结果进行了有效性评估,包括语义相似度检查、关键词匹配和重复性检测,确保生成的QA对质量可靠,适用于知识库测试与评估。
258 86
|
2月前
|
存储 数据可视化 BI
Python可视化应用——学生成绩分布柱状图展示
本程序使用Python读取Excel中的学生成绩数据,统计各分数段人数,并通过Matplotlib库绘制柱状图展示成绩分布。同时计算最高分、最低分及平均分,实现成绩可视化分析。
149 0
|
1月前
|
存储 程序员 数据处理
Python列表基础操作全解析:从创建到灵活应用
本文深入浅出地讲解了Python列表的各类操作,从创建、增删改查到遍历与性能优化,内容详实且贴近实战,适合初学者快速掌握这一核心数据结构。
144 0
|
1月前
|
中间件 机器人 API
Python多态实战:从基础到高阶的“魔法”应用指南
Python多态机制通过“鸭子类型”实现灵活接口,使不同对象统一调用同一方法,自动执行各自行为。它简化代码逻辑、提升扩展性,适用于数据处理、策略切换、接口适配等场景。掌握多态思维,能有效减少冗余判断,使程序更优雅、易维护。
98 0
|
2月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
60 1
|
1月前
|
存储 监控 安全
Python剪贴板监控实战:clipboard-monitor库的深度解析与扩展应用
本文介绍了基于Python的剪贴板监控技术,结合clipboard-monitor库实现高效、安全的数据追踪。内容涵盖技术选型、核心功能开发、性能优化及实战应用,适用于安全审计、自动化办公等场景,助力提升数据管理效率与安全性。
88 0
|
2月前
|
存储 监控 安全
Python剪贴板监控实战:clipboard-monitor库的深度解析与扩展应用
本文介绍如何利用Python的clipboard-monitor库实现剪贴板监控系统,涵盖文本与图片的实时监听、防重复存储、GUI界面开发及数据加密等核心技术,适用于安全审计与自动化办公场景。
91 0
|
2月前
|
数据采集 API 调度
Python爬虫框架对比:Scrapy vs Requests在API调用中的应用
本文对比了 Python 中 Scrapy 与 Requests 两大爬虫框架在 API 调用中的差异,涵盖架构设计、调用模式、性能优化及适用场景,并提供实战建议,助力开发者根据项目需求选择合适工具。

热门文章

最新文章

推荐镜像

更多