python功能测试

文章目录

    • unnittest
      • 1. 基本结构
      • 2. 常用断言方法
      • 3. 测试生命周期方法
      • 4. 跳过测试
      • 5. 运行测试
    • pytest
      • 1. 基本测试用法
      • 2. 安装 `pytest`
      • 3. 运行测试
      • 4. 使用 `assert` 断言
      • 5. 异常测试
      • 6. 参数化测试
      • 7. 测试前后设置
      • 8. 跳过测试和标记失败
      • 9. 测试夹具 (Fixtures)
      • 10. 生成测试报告
      • 11. 插件
      • 12. 运行整个目录中的测试

unnittest

unittest 是 Python 自带的单元测试框架,用于编写、组织和运行测试。下面是一些常见的 unittest 用法:

1. 基本结构

unittest 中,通常通过创建类继承自 unittest.TestCase 来定义测试用例,并在该类中编写测试方法。测试方法的名称必须以 test_ 开头。

import unittest

# 定义要测试的函数
def add(x, y):
    return x + y

# 定义测试类
class TestMath(unittest.TestCase):

    # 编写测试方法
    def test_add(self):
        self.assertEqual(add(1, 2), 3)  # 测试 1 + 2 是否等于 3
        self.assertEqual(add(-1, 1), 0) # 测试 -1 + 1 是否等于 0

# 运行测试
if __name__ == '__main__':
    unittest.main()

2. 常用断言方法

unittest.TestCase 提供了一些常见的断言方法来检查代码的行为:

  • assertEqual(a, b): 检查 a == b
  • assertNotEqual(a, b): 检查 a != b
  • assertTrue(x): 检查 x 是否为 True
  • assertFalse(x): 检查 x 是否为 False
  • assertIs(a, b): 检查 a is b
  • assertIsNot(a, b): 检查 a is not b
  • assertIsNone(x): 检查 x 是否为 None
  • assertIsNotNone(x): 检查 x 是否不为 None
  • assertIn(a, b): 检查 a 是否在 b
  • assertNotIn(a, b): 检查 a 是否不在 b
  • assertRaises(exc, callable, *args, **kwds): 检查是否抛出异常

3. 测试生命周期方法

unittest 提供了一些方法来管理测试前后的操作:

  • setUp(): 每个测试方法执行前调用
  • tearDown(): 每个测试方法执行后调用
  • setUpClass(): 在所有测试开始之前调用(类方法,使用 @classmethod 修饰)
  • tearDownClass(): 在所有测试结束之后调用(类方法,使用 @classmethod 修饰)
class TestMath(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("所有测试之前调用")

    def setUp(self):
        print("每个测试之前调用")

    def test_add(self):
        self.assertEqual(add(1, 2), 3)

    def tearDown(self):
        print("每个测试之后调用")

    @classmethod
    def tearDownClass(cls):
        print("所有测试之后调用")

4. 跳过测试

有时某些测试可能需要跳过或被标记为待定,unittest 提供了几种方式来实现:

  • @unittest.skip(reason): 跳过测试
  • @unittest.skipIf(condition, reason): 条件为真时跳过
  • @unittest.skipUnless(condition, reason): 条件为假时跳过
  • @unittest.expectedFailure: 预期会失败的测试
class TestMath(unittest.TestCase):

    @unittest.skip("跳过此测试")
    def test_add(self):
        self.assertEqual(add(1, 2), 3)

    @unittest.skipIf(1 < 2, "条件为真时跳过")
    def test_subtract(self):
        self.assertEqual(subtract(2, 1), 1)

5. 运行测试

可以直接通过命令行运行测试文件:

python -m unittest test_module.py

也可以一次性运行整个目录的测试:

python -m unittest discover

以上是 Python 中 unittest 框架的常见用法,你可以根据需要编写单元测试并运行以确保代码的正确性。

pytest

pytest 是 Python 中非常流行的测试框架,简单易用,功能强大,适合编写单元测试和集成测试。相比于 unittestpytest 具有更简洁的语法和更丰富的插件生态。

1. 基本测试用法

pytest 可以直接通过函数来编写测试,而不需要像 unittest 那样定义测试类。测试函数的名称必须以 test_ 开头。

# test_example.py

def add(x, y):
    return x + y

# 编写测试函数
def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0

2. 安装 pytest

pip install pytest

3. 运行测试

直接在命令行中运行 pytest 命令,它会自动发现所有以 test_ 开头的文件和函数:

pytest

还可以指定某个具体的测试文件或测试函数:

pytest test_example.py
pytest test_example.py::test_add

4. 使用 assert 断言

pytest 直接使用 Python 的 assert 语句进行断言,而不需要使用 unittest 中复杂的断言方法。当断言失败时,pytest 会给出详细的错误报告。

def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0
    assert add(0, 0) == 0

5. 异常测试

pytest 提供了 pytest.raises 来检查代码是否抛出指定的异常。

import pytest

def divide(x, y):
    if y == 0:
        raise ValueError("除数不能为零")
    return x / y

def test_divide():
    with pytest.raises(ValueError, match="除数不能为零"):
        divide(1, 0)

6. 参数化测试

通过 pytest.mark.parametrize 装饰器,可以实现参数化测试,让同一个测试函数可以测试多个输入和预期输出。

import pytest

# 参数化测试
@pytest.mark.parametrize("x, y, expected", [
    (1, 2, 3),
    (-1, 1, 0),
    (0, 0, 0),
])
def test_add(x, y, expected):
    assert add(x, y) == expected

7. 测试前后设置

pytest 提供了 setup_functionteardown_function 用于在每个测试函数运行前后执行一些准备或清理工作,类似于 unittest 中的 setUptearDown

def setup_function():
    print("每个测试之前执行")

def teardown_function():
    print("每个测试之后执行")

def test_example():
    assert 1 == 1

8. 跳过测试和标记失败

pytest 支持条件跳过测试以及标记测试为预期失败:

  • @pytest.mark.skip(reason="跳过原因"):跳过某个测试
  • @pytest.mark.skipif(condition, reason="跳过原因"):条件为真时跳过
  • @pytest.mark.xfail:标记为预期失败的测试
import pytest

@pytest.mark.skip(reason="暂时跳过")
def test_skip():
    assert 1 == 1

@pytest.mark.skipif(1 < 2, reason="条件为真时跳过")
def test_skipif():
    assert 1 == 1

@pytest.mark.xfail
def test_xfail():
    assert 1 == 2  # 预期失败

9. 测试夹具 (Fixtures)

pytest 提供了强大的夹具功能(Fixture)来在测试中共享和复用资源。通过使用 @pytest.fixture 装饰器可以定义一个夹具,并在测试函数中传入它。

import pytest

@pytest.fixture
def sample_data():
    return {"name": "Alice", "age": 30}

def test_sample_data(sample_data):
    assert sample_data["name"] == "Alice"
    assert sample_data["age"] == 30

10. 生成测试报告

运行 pytest 时可以生成更详细的报告:

pytest -v  # 显示每个测试的详细信息
pytest --maxfail=3 -v  # 最多失败3个测试后停止
pytest --tb=short  # 输出简短的回溯信息

11. 插件

pytest 具有丰富的插件生态系统。例如:

  • pytest-cov: 用于生成代码覆盖率报告
  • pytest-xdist: 并行运行测试
  • pytest-mock: 与 unittest.mock 集成的插件

安装插件的方式:

pip install pytest-cov
pytest --cov=your_module test_example.py  # 运行并生成覆盖率报告

12. 运行整个目录中的测试

pytest 可以一次运行整个目录中的测试文件,自动查找所有 test_ 开头的文件和测试函数:

pytest tests/

pytest 的语法简单而灵活,非常适合写 Python 的测试代码。希望这些用法对你有帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPS中让两列数据合并的方法

有这样一个需求&#xff0c;就是把A列数据和B列数据进行合并&#xff08;空单元格略过&#xff09;具体实现效果如图下&#xff1a; 该如何操作呢&#xff1f; 首先在新的一列第一个单元格中输入公式"A1&B1" 然后回车&#xff0c;就出现了两列单元格数据合并的效…

APScheduler、Django实现定时任务,以及任务动态操作

环境&#xff1a;Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4 背景&#xff1a;工作需要使用且用法较为复杂&#xff0c;各种功能基本都使用了 事件&#xff1a;20240920 说明&#xff1a;记录&#xff0c;方便后期自己查找 1、搭建基础环境 文件结构图…

node.js从入门到快速开发一个简易的web服务器

浏览器中JavaScript学习路径: JavaScript基础语法浏览器内置API(DOMBOM)第三方库(jQuery,art-template等) Node.js的学习路径 JavaScript基础语法Node.js内置API模块(fs、path、http等)第三方API模块(express、mysql等) Node.js安装 通过Node.js 来运行Javascript 代码&am…

ElasticSearch的安装与使用

ElasticSearch的安装与使用 docker安装 docker进行安装Elasticsearch 1.拉取镜像 docker pull elasticsearch:7.6.22.创建实例 mkdir -p /docker/elasticsearch/config mkdir -p /docker/elasticsearch/data echo "http.host: 0.0.0.0" >> /docker/elastic…

C语言课程设计题目四:实验设备管理系统设计

序号系统设计题目进度1职工信息管理系统设计已完成&#xff0c;在本专栏2图书信息管理系统设计已完成&#xff0c;在本专栏3图书管理系统设计已完成&#xff0c;在本专栏4实验设备管理系统设计已完成&#xff0c;在本专栏5西文下拉菜单的设计链接6学生信息管理系统设计链接7学生…

c++9月20日

1.思维导图 2.顺序表 头文件 #ifndef RECTANGLE_H #define RECTANGLE_H#include <iostream>using namespace std;using datatype int ;//类型重定义class Seqlist { private://私有权限datatype *ptr; //指向堆区申请空间的起始地址int size;//堆区空间的长度int len …

汽车一键启动开关

‌ 一键启动点火开关是汽车上的一个重要功能&#xff0c;它替代了传统的机械钥匙&#xff0c;实现了简约的打火和熄火操作‌。移动管家一键启动点火开关的详细介绍&#xff1a; 汽车一键启动按钮12V24V通用超薄型汽车一键启动按键发动机启动按钮点火开关。超薄&#xff0c;…

软件测试学习笔记丨curl命令发送请求

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32332 一、简介 cURL是一个通过URL传输数据的&#xff0c;功能强大的命令行工具。cURL可以与Chrome Devtool工具配合使用&#xff0c;把浏览器发送的真实请求还原出来&#xff0c;附带认证信…

嵌入式项目:STM32平衡车详解 (基础知识篇) (基于STM32F103C8T6)

前言&#xff1a; 本文是基于B站草履虫编写的平衡车相关内容&#xff0c;包括模块和基础知识&#xff0c;结合代码进行讲解&#xff0c;将知识进行汇总 &#xff08;由于本篇内容较长&#xff0c;请结合目录使用) 注&#xff1a;基于开源精神&#xff0c;本文仅供学习参考 目…

如何用ChatGPT制作一款手机游戏应用

有没有想过自己做一款手机游戏&#xff0c;并生成apk手机应用呢&#xff1f;有了人工智能&#xff0c;这一切就成为可能。今天&#xff0c;我们就使用ChatGPT来创建一个简单的井字棋游戏&#xff08;Tic-Tac-Toe&#xff09;&#xff0c;其实这个过程非常轻松且高效。 通过Cha…

windows 使用PortAudio 对电脑进行录音

PortAudio 采用回调方式&#xff0c;这样可以一帧一帧的处理 头文件&#xff1a; #ifndef __CAPTURE_AUDIO__ #define __CAPTURE_AUDIO__#include <functional> #include <windows.h> #include "portaudio.h"#define SAMPLE_RATE 44100class CaptureAu…

大数据毕业设计选题推荐-国潮男装微博评论数据分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

JavaSE——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…

89个H5小游戏源码

下载地址&#xff1a;https://download.csdn.net/download/w2sft/89791650 亲测可用&#xff0c;代码完整&#xff0c;都是htmljs&#xff0c;保存到本地即可。 游戏截图&#xff1a;

【AI创作组】工程方向的硕士研究生学习Matlab的路径

1. MATLAB软件概述 1.1 MATLAB发展历程 MATLAB自20世纪70年代诞生以来,已经经历了多次重要的版本更新和功能扩展。 初始版本:MATLAB的前身只是一个简单的交互式矩阵计算器,由Cleve B. Moler博士在1970年代初期开发,目的是为了方便学生和研究人员使用线性代数软件包LINPAC…

游戏如何对抗改包

游戏改包是指通过逆向分析手段及修改工具&#xff0c;来篡改游戏包内正常的设定和规则的行为&#xff0c;游戏包被篡改后&#xff0c;会被植入/剔除模块进行重打包。 本期图文我们将通过实际案例分析游戏改包的原理&#xff0c;并分享游戏如何应对改包问题。 安卓平台常见的改…

车载软件调试工具系列---Trace32简介UI界面简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

基于nodejs+vue的旅游管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

想要高音质的开放式耳机?看看开放式蓝牙耳机排行榜前列的这些品牌!

​开放式蓝牙耳机现在超流行&#xff0c;不仅年轻人爱用&#xff0c;连不少上了年纪的人也喜欢在公园里散步时戴上。这些耳机无论是听歌、学习、健身还是办公&#xff0c;都能派上用场。到了2024年&#xff0c;想要挑到一款既好用又好听的开放式蓝牙耳机&#xff0c;得好好比较…

springboot+大数据基于数据挖掘的招聘信息可视化大屏系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…