Python测试应用与工具

news2024/10/7 13:16:03

文章目录

  • 前言
    • 环境准备
    • unittest
    • pytest
      • pytest插件
    • mock
    • 最后


前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


Python测试应用与公具 今天跟大家分享一个Python与测试相关的话题,主要介绍Python中的标准库 unittest及第三方测试工具pytestmock。介绍了它们的基本使用。

环境准备

  • 一台Windows机器,或一台Linux机器,亦或一台Mac
  • 安装Python,版本为2.7.x或3.5.x
  • 要有pip工具(Python2),Python3不做要求

unittest

unittest是Python标准库中用于单元测试的模块。单元测试用来对最小可测试单元进行正确性检验,帮助我们在上线之前发现问题。

接下来我们通过测试collections模块中的Counter类,先来了解unittest的用法。大家或许对collections库中Counter类不太熟悉,为了让大家更好地理解这个例子,这里简单介绍一下Counter的使用。

>>> from collections import Counter
>>> c = Counter('abcdaba') # 用来计算字符串abcdaba中各个字符出现的次数
>>> c.keys()
dict_keys(['a', 'b', 'c', 'd'])
>>> c.values()
dict_values([3, 2, 1, 1])
>>> c.elements()
<bound method Counter.elements of Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})>
>>> c['a']
3
>>> c['b']
2
>>> c['c']
1
>>> c['d']
1

一个测试脚本:

# filename: ut_case.py
import unittest
from collections import Counter

class TestCounter(unittest.TestCase):
    def setUp(self):
        self.c = Counter('abcdaba')
        print('setUp starting...')
        
    def test_basics(self):
        c = self.c
        self.assertEqual(c, Counter(a=3, b=2, c=1, d=1))
        self.assertIsInstance(c, dict)
        self.assertEqual(len(c), 4)
        self.assertIn('a', c)
        self.assertNotIn('f', c)
        self.assertRaises(TypeError, hash, c)
        
    def test_update(self):
        c = self.c
        c.update(f=1)
        self.assertEqual(c, Counter(a=3, b=2, c=1, d=1, f=1))
        c.update(a=10)
        self.assertEqual(c, Counter(a=13, b=2, c=1, d=1, f=1))
        
    def tearDown(self):
        print('tearDown starting...')


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

setUp方法列出了测试前的准备工作,常用来做一些初始化的工作,非必需方法。tearDown方法列出了测试完成后的收尾工作,用来销毁测试过程中产生的影响,也是非必需方法。TestCase,顾名思义表示测试用例,一个测试用例可以包含多个测试方法,每个测试方法都要以test_开头。测试方法中用到的self.assertXXX方法是断言语句,单元测试都是使用这样的断言语句判断测试是否通过的:如果断言为False,会抛出AssertionError异常,测试框架就会认为此测试用例测试失败。

运行一下上面的脚本:

(venv) C:\Users\LavenLiu\IdeaProjects\TestOps>python ut_case.py
setUp starting...
tearDown starting...
.setUp starting...
tearDown starting...
.
----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK

可以看到每次执行test_开头的方法时,都会执行setUptearDown

pytest

Python标准库提供的测试模块功能相对单一,所以在项目中通常会额外使用第三方的测试工具。这里我们介绍pytest,pytest除了比Python标准的单元测试模块unittest更简洁和高效外,还有如下特点:

  • 容易上手,入门简单,官方文档有很多实例可供参考。
  • 可以自动发现需要测试的模块和函数。
  • 支持运行由nose、unittest等模块编写的测试用例。
  • 有很多第三方插件,并且可以方便地自定义插件。
  • 很容易与持续集成工具结合。
  • 可以细粒度地控制要测试的测试用例。

我们要先安装pytest库:

pip install pytest

接下来演示pytest常用的测试方法。一个测试用例:

# filename: test_pytest.py
import pytest


@pytest.fixture        # 创建测试环境,可以用来做setUp和tearDown的工作
def setup_math():
    import math
    return math

@pytest.fixture(scope='function')
def setup_function(request):
    def teardown_function():
        print('teardown_function called.')
    request.addfinalizer(teardown_function)  # 这个内嵌函数做tearDown工作
    print('setup_function called.')


def test_func(setup_function):
    print('Test_Func called.')


def test_setup_math(setup_math):
    # pytest不需要使用self.assertXXX这样的方法,直接使用Python内置的assert断言语句即可
    assert setup_math.pow(2, 3) == 8.0


class TestClass(object):
    def test_in(self):
        assert 'h' in 'hello'

    def test_two(self, setup_math):
        assert setup_math.ceil(10) == 10.0


def raise_exit():
    raise SystemExit(1)


def test_mytest():
    with pytest.raises(SystemExit):
        raise_exit()


@pytest.mark.parametrize('test_input, expected', [
    ('1+3', 4),
    ('2*4', 8),
    ('1==2', False),
])  # parametrize可以用装饰器的方式集成多组测试用例
def test_eval(test_input, expected):
    assert eval(test_input) == expected

unittest必须把测试放在TestCase类中,pytest只要求测试函数或者类以test开头即可。运行一下上面的脚本:

(venv) C:\Users\LavenLiu\IdeaProjects\TestOps>py.test test_pytest.py
============================= test session starts =============================
platform win32 -- Python 3.6.3, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: C:\Users\LavenLiu\IdeaProjects\TestOps, inifile:
plugins: xdist-1.20.1, random-0.2, metadata-1.5.0, instafail-0.3.0, html-1.16.0, forked-0.2
collected 12 items

test_pytest.py ............
========================== 12 passed in 0.05 seconds ==========================

测试通过,我们让其中一个测试用例测试失败:

(venv) C:\Users\LavenLiu\IdeaProjects\TestOps>py.test test_pytest.py
============================= test session starts =============================

platform win32 -- Python 3.6.3, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: C:\Users\LavenLiu\IdeaProjects\TestOps, inifile:
plugins: xdist-1.20.1, random-0.2, metadata-1.5.0, instafail-0.3.0, html-1.16.0, forked-0.2
collected 8 items

test_pytest.py ...F....
================================== FAILURES ===================================
_____________________________ TestClass.test_two ______________________________
self = <test_pytest.TestClass object at 0x0000000003837588>
setup_math = <module 'math' (built-in)>

    def test_two(self, setup_math):
>      assert setup_math.ceil(10) == 11.0
E      AssertionError: assert 10 == 11.0
E        +  where 10 = <built-in function ceil>(10)E        
+    where <built-in function ceil> = <module 'math' (built-in)>.ceil

test_pytest.py:31: AssertionError
===================== 1 failed, 7 passed in 0.08 seconds ======================

pytest帮助我们定位到测试失败的位置,并告诉我们预期值和实际值。pytest的命令行功能非常丰富:

# 与使用pytest的作用一样
python -m pytest test_pytest.py
# 验证整个目录
pytest /path/to/test/dir
# 只验证文件中的单个测试用例,这在实际工作中非常方便,
# 否则可能需要运行一段时间才能轮到有问题的测试用例,极为浪费时间。
# 使用这样的方式就可以有针对性地验证有问题的测试用例
pytest test_pytest.py::test_mytest
# 只验证测试类中的单个方法
pytest test_pytest.py::TestClass::test_in

pytest插件

pytest有丰富的插件,这里列出几个常用的pytest插件,pytest插件都是以pytest-开头。

  • pytest-random:可以让测试变得随机。当有很多测试用例时,这个插件不会让测试只卡在一个异常上,有助于发现其他异常。
  • pytest-xdist:让pytest支持分布式测试
  • pytest-instafail:一旦出现错误信息就立即返回,不需要等到全部测试结束后才显示。
  • pytest-html:可以生存测试报告文件。

mock

Mock测试是在测试过程中对可能不稳定、有副作用、不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便完成测试的方法。在Python中,这种测试是通过第三方的mock库完成的,mock在Python3.3的时候被引入到了Python标准库中,改名为unittest.mock。之前的Python版本都需要安装它:

pip install mock

假设现在一个单元测试依赖外部的API返回值。举个例子(client.py):

# filename: client.py
import requests


def api_request(url):
    r = requests.get(url)
    return r.json()


def get_review_author(url):
    res = api_request(url)
    return res['review']['author']

如果在测试时,每次都真正请求这个接口,就会有两个问题:

  • 测试环境可能和线上环境不同,需要搭建本地的API服务,尤其是需要本地环境能返回线上环境实际的全部结果,增加复杂度且效率低下。
  • 测试结果严重依赖外部API服务的稳定性。

使用mock的解决方案如下(test_mock.py):

# filename: test_mock.py
import unittest
import mock
import client


class TestClient(unittest.TestCase):
    def setUp(self):
        self.result = {'review': {'author': 'testops'}}

    def test_request(self):
        api_result = mock.Mock(return_value=self.result)
        client.api_request = api_result
        self.assertEqual(client.get_review_author(
            'http://api.testops.cn/review/123'), 'testops')

运行一下看看效果:

(venv) C:\Users\LavenLiu\IdeaProjects\TestOps>pytest test_mock_py3.py
============================= test session starts =============================

rootdir: C:\Users\LavenLiu\IdeaProjects\TestOps, inifile:
plugins: xdist-1.20.1, random-0.2, metadata-1.5.0, instafail-0.3.0, html-1.16.0, forked-0.2
collected 1 item

test_mock_py3.py .
========================== 1 passed in 0.36 seconds ===========================

可以看到,这个测试并没有实际地请求API就达到了测试的目的。

最后

分享一份完整版的Python全套学习资料

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

|

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MVTEC 3D dataset

官网&#xff1a;https://www.mvtec.com/company/research/datasets/mvtec-3d-ad/downloads https://www.mvtec.com/company/research/datasets/mvtec-3d-adhttps://www.mvtec.com/company/research/datasets/mvtec-3d-ad 数据大小&#xff1a;13个G 1. 介绍 MVTec 3D异常检测…

【lora模块调试:亿百特lora-型号E22-400T30D-V=初步调试踩坑-认识模块-了解协议(1)】

【lora模块调试&#xff1a;亿百特lora-型号E22-400T30D-V初步调试踩坑-认识模块-了解协议&#xff08;1&#xff09;】 1、概述2、实验环境3-1&#xff1a;先行了解3-2&#xff1a;经验总结4、硬件线路连接方式1、厂家提供的ttl转usb的模块2、使用开发板上的串口3、自己弄个转…

基于Java+Vue前后端分离网上拍卖系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

智能批量剪辑系统源码开发者如何减少服务器成本?

一、智能混剪批量剪辑自研与接入第三方“如阿里云”接口的差别 智能混剪批量剪辑自研和接入第三方"如阿里云"接口的差别主要在于技术实现和功能定制。自研混剪系统需要团队投入大量时间和资源来研发和维护&#xff0c;并且能够根据用户需求定制和优化功能&#xff0…

6 中断概览(STM32HAL库)

目录 中断概览 STM32异常和中断介绍 STM32的异常一览 STM32的中断表一览 中断的优先级 中断的优先级分组 优先级分组 嵌套向量中断控制器(NVIC)功能 中断概览 什么是中断&#xff1f; 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器…

如何理解Spring Bean?

文章目录 一、什么是 Spring Bean&#xff1f;二、定义Spring Bean 有哪些方式&#xff1f;三、Spring 容器是如何加载 Bean 的&#xff1f; 我一共分三段来介绍&#xff0c;首先&#xff0c;介绍什么是 Spring Bean&#xff1f;然后&#xff0c;定义Spring Bean 有哪些方式&am…

typescript Constructor Set requires ‘new‘

使用typescript的class继承时报错 “构造函数集需要’new’” ts代码 class MySet extends Set {constructor() {super();}let myset new MySet();控制台错误 只需要在tsconfig.json文件中添加以下配置即可 "compilerOptions": {"target": "es6…

面试常问 什么是回表?为什么需要回表?

小伙伴们在面试的时候&#xff0c;有一个特别常见的问题&#xff0c;那就是数据库的回表。什么是回表&#xff1f;为什么需要回表&#xff1f; 索引结构 要搞明白这个问题&#xff0c;需要大家首先明白 MySQL 中索引存储的数据结构。这个其实很多小伙伴可能也都听说过&#xf…

SQL方言:传统关系型数据库下的方言对比

前言&#xff1a; 技术多元化是一个趋势&#xff0c;多语言并存&#xff0c;多数据库适配&#xff0c;多环境兼容>< 场景&#xff1a; 当从SQL Server数据库迁移到MySql数据库或者Oracle数据库&#xff0c;甚至国产化数据库&#xff0c;不同数据库之间可以自定义切换&…

实现firebase FCM和Analytics

前提&#xff1a;1.需要vpn 2.带有google 服务的手机 注意&#xff01;&#xff01;&#xff01; 这个在2023年6月30日时还是测试版&#xff0c;所以手机有概率接收不到消息 编写代码前需要在https://console.firebase.google.com/ 配置好参数 这里的token值需要填写代码内的i…

macOS 系统 安装 Kafka 快速入门

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…

神策(Android)- 集成基础埋点的整个过程

记得最早以前都是用友盟全家桶&#xff0c;埋点是用友盟&#xff0c;推送也是用友盟&#xff1b;但是近俩年我参与开发的app&#xff0c;埋点都是用神策、推送都是用极光私服&#xff0c;分享都是去对应集成对应平台的SDK 神策篇 神策&#xff08;Android&#xff09;- 集成基…

2023-6-30-第十二式组合模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

Linux的tmux的使用

0.前言 您好&#xff0c;这里是limou3434&#xff0c;本次我将给您带来Linux下tmux的使用。 如果您感兴趣也可以看看我的其他内容。 1.tmux的基础概念 tmux是一款在Linux里运行在终端上的软件&#xff0c;可以使得终端具有强大的多任务管理功能&#xff08;以下是在Ubuntu环…

CSS知识点汇总(八)--Flexbox

1. flexbox&#xff08;弹性盒布局模型&#xff09;是什么&#xff0c;适用什么场景&#xff1f; 1. flexbox&#xff08;弹性盒布局模型&#xff09;是什么 Flexible Box 简称 flex&#xff0c;意为”弹性布局”&#xff0c;可以简便、完整、响应式地实现各种页面布局。采用…

Python高级教程:简单爬虫实践案例

学习目标 能够知道Web开发流程 能够掌握FastAPI实现访问多个指定网页 知道通过requests模块爬取图片 知道通过requests模块爬取GDP数据 能够用pyecharts实现饼图 能够知道logging日志的使用 一、基于FastAPI之Web站点开发 FastAPI是一个高性能、易于使用、快速编写API的…

新品亮相丨美格智能高性能Cat.1 bis模组SLM332X上市

6月29日&#xff0c;2023 MWC 上海世界移动通信大会火热进行中。展会现场&#xff0c;美格智能正式发布基于芯翼信息科技XY4100芯片平台研发的高性能4G LTE Cat.1 bis模组SLM332X。该产品可广泛应用于智能支付、智慧表计、共享经济、公网对讲机、定位追踪、智能穿戴、安防监控等…

Web3本地搭建truffle智能合约开发环境

之前的几篇文章 我们是成功的操作了我们本地区块链的 那么 本文 我们就来说说智能合约 啊 不容易啊 扯了这么久 终于到这了 智能合约是部署在区块链上 不可逆的 一种去中心化的程序&#xff0c;他没有任何第三方公司来管理这个程序和数据 然后 还有就是怎么连接到区块链上的智能…

基于Java星空游戏购买下载平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

浅谈基于微电网的智慧校园能耗监测系统的设计与产品应用

摘 要&#xff1a;针对高校教学建筑能效监管效率低的问题&#xff0c;从系统总体设计、分层设计、硬件系统设计、软件系统设计、功能测试等方面阐述了一种基于物联网技术的智慧校园建筑能效监管系统。通过对能耗监管系统关键功能的测试&#xff0c;测试效果良好&#xff0c;结果…