当前位置: 首页 > news >正文

Python 面试:单元测试unit testing 使用pytest

1. 对于函数进行单元测试

calc.py

def add(x, y):"""Add Function"""return x + ydef subtract(x, y):"""Subtract Function"""return x - ydef multiply(x, y):"""Multiply Function"""return x * ydef divide(x, y):"""Divide Function"""if y == 0: raise ValueError('Can not divide by zero!')return x / y

test_calc.py

import unittest
import calcclass TestCalc(unittest.TestCase):def test_add(self):self.assertEqual(calc.add(10, 5), 15)self.assertEqual(calc.add(-1, 1), 0)self.assertEqual(calc.add(-1, -1), -2)def test_subtract(self):self.assertEqual(calc.subtract(10, 5), 5)self.assertEqual(calc.subtract(-1, 1), -2)self.assertEqual(calc.subtract(-1, -1), 0)def test_multiply(self):self.assertEqual(calc.multiply(10, 5), 50)self.assertEqual(calc.multiply(-1, 1), -1)self.assertEqual(calc.multiply(-1, -1), 1)def test_divide(self):self.assertEqual(calc.divide(10, 5), 2)self.assertEqual(calc.divide(-1, 1), -1)self.assertEqual(calc.divide(-1, -1), 1)self.assertRaises(ValueError, calc.divide, 10, 0)if __name__ == '__main__':unittest.main()

2. 对于对象(object)进行单元测试

employee.py

class Employee:"""A sample Employee class"""raise_amt = 1.05def __init__(self, first, last, pay):self.first = firstself.last = lastself.pay = pay@propertydef email(self):return '{}.{}@email.com'.format(self.first, self.last)@propertydef fullname(self):return '{} {}'.format(self.first, self.last)def apply_raise(self):self.pay = int(self.pay * self.raise_amt)

test_employee.py

import unittest
from employee import Employeeclass TestEmployee(unittest.TestCase):@classmethoddef setUpClass(cls):print('setupClass')@classmethoddef tearDownClass(cls):print('teardownClass')def setUp(self):print('setUp')self.emp_1 = Employee('Elon', 'Musk', 50000)self.emp_2 = Employee('Sue', 'Smith', 60000)def tearDown(self):print('tearDown\n')def test_email(self):print('test_email')self.assertEqual(self.emp_1.email, 'Elon.Musk@email.com')self.assertEqual(self.emp_2.email, 'Sue.Smith@email.com')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.email, 'John.Musk@email.com')self.assertEqual(self.emp_2.email, 'Jane.Smith@email.com')def test_fullname(self):print('test_fullname')self.assertEqual(self.emp_1.fullname, 'Elon Musk')self.assertEqual(self.emp_2.fullname, 'Sue Smith')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.fullname, 'John Musk')self.assertEqual(self.emp_2.fullname, 'Jane Smith')def test_apply_raise(self):print('test_apply_raise')self.emp_1.apply_raise()self.emp_2.apply_raise()self.assertEqual(self.emp_1.pay, 52500)self.assertEqual(self.emp_2.pay, 63000)if __name__ == '__main__':unittest.main()

输出为:
setupClass
setUp
test_apply_raise
tearDown

.setUp
test_email
tearDown

.setUp
test_fullname
tearDown

.teardownClass


Ran 3 tests in 0.001s

OK

3. 使用mock模拟对象库

employee.py

import requestsclass Employee:"""A sample Employee class"""raise_amt = 1.05def __init__(self, first, last, pay):self.first = firstself.last = lastself.pay = pay@propertydef email(self):return '{}.{}@email.com'.format(self.first, self.last)@propertydef fullname(self):return '{} {}'.format(self.first, self.last)def apply_raise(self):self.pay = int(self.pay * self.raise_amt)def monthly_schedule(self, month):response = requests.get(f'http://company.com/{self.last}/{month}')if response.ok:return response.textelse:return 'Bad Response!'

test_employee.py

import unittest
from unittest.mock import patch
from employee import Employeeclass TestEmployee(unittest.TestCase):@classmethoddef setUpClass(cls):print('setupClass')@classmethoddef tearDownClass(cls):print('teardownClass')def setUp(self):print('setUp')self.emp_1 = Employee('Elon', 'Musk', 50000)self.emp_2 = Employee('Sue', 'Smith', 60000)def tearDown(self):print('tearDown\n')# Test 1def test_email(self):print('test_email')self.assertEqual(self.emp_1.email, 'Elon.Musk@email.com')self.assertEqual(self.emp_2.email, 'Sue.Smith@email.com')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.email, 'John.Musk@email.com')self.assertEqual(self.emp_2.email, 'Jane.Smith@email.com')# Test 2def test_fullname(self):print('test_fullname')self.assertEqual(self.emp_1.fullname, 'Elon Musk')self.assertEqual(self.emp_2.fullname, 'Sue Smith')self.emp_1.first = 'John'self.emp_2.first = 'Jane'self.assertEqual(self.emp_1.fullname, 'John Musk')self.assertEqual(self.emp_2.fullname, 'Jane Smith')# Test 3def test_apply_raise(self):print('test_apply_raise')self.emp_1.apply_raise()self.emp_2.apply_raise()self.assertEqual(self.emp_1.pay, 52500)self.assertEqual(self.emp_2.pay, 63000)# Test 4def test_monthly_schedule(self):# 模拟替换网络请求with patch('employee.requests.get') as mocked_get:mocked_get.return_value.ok = Truemocked_get.return_value.text = 'Success'schedule = self.emp_1.monthly_schedule('May')mocked_get.assert_called_with('http://company.com/Musk/May')self.assertEqual(schedule, 'Success')mocked_get.return_value.ok = Falseschedule = self.emp_2.monthly_schedule('June')mocked_get.assert_called_with('http://company.com/Smith/June')self.assertEqual(schedule, 'Bad Response!')if __name__ == '__main__':unittest.main()

输出为:
setupClass
setUp
test_apply_raise
tearDown

.setUp
test_email
tearDown

.setUp
test_fullname
tearDown

.setUp
tearDown

.teardownClass


Ran 4 tests in 0.001s

OK

4. 使用pytest进行测试

binarysearch.py,主要使用assert。

def binary_search(array, target):if not array:return -1begin, end = 0, len(array)while begin < end:mid = begin + (end - begin) // 2if array[mid] == target:return midelif array[mid] > target:end = midelse:begin = mid + 1return -1def test():assert binary_search([0, 1, 2, 3, 4, 5], 1) == 1assert binary_search([0, 1, 2, 3, 4, 5], 6) == -1assert binary_search([0, 1, 2, 3, 4, 5], -1) == -1assert binary_search([0, 1, 2, 3, 4, 5], 0) == 0assert binary_search([0, 1, 2, 3, 4, 5], 5) == 5assert binary_search([0], 0) == 0assert binary_search([], 1) == -1

在CMD中输入指令:pytest binarysearch.py

输出为:
================================================= test session starts =================================================
platform win32 – Python 3.10.9, pytest-7.1.2, pluggy-1.0.0
rootdir: C:\Users\h13je\Working_Log\01092023\python_learning
plugins: anyio-3.5.0
collected 1 item

binarysearch.py . [100%]

================================================== 1 passed in 0.02s ==================================================

相关文章:

Python 面试:单元测试unit testing 使用pytest

1. 对于函数进行单元测试 calc.py def add(x, y):"""Add Function"""return x ydef subtract(x, y):"""Subtract Function"""return x - ydef multiply(x, y):"""Multiply Function""…...

螺旋矩阵、旋转矩阵、矩阵Z字打印

螺旋矩阵 #include <iostream> #include <vector> void display(std::vector<std::vector<int>>&nums){for(int i 0; i < nums.size(); i){for(int j 0; j < nums[0].size(); j){std::cout<<nums[i][j]<< ;}std::cout<<…...

Seaborn绘制热力图的子图

Seaborn绘制热力图的子图 提示&#xff1a;如何绘制三张子图 绘制的时候&#xff0c;会出现如下问题 &#xff08;1&#xff09;如何绘制1*3的子图 &#xff08;2&#xff09;三个显示条&#xff0c;如何只显示最后一个 提示&#xff1a;下面就展示详细步骤 Seaborn绘制热力…...

C++二级题目4

小白鼠再排队 不会 多余的数 #include<iostream> #include<string.h> #include<stdio.h> #include<iomanip> #include<cmath> #include<bits/stdc.h> int a[2000][2000]; int b[2000]; char c[2000]; long long n; using namespace std; i…...

Tomcat 部署时 war 和 war exploded区别

在 Tomcat 调试部署的时候&#xff0c;我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别&#xff1a; war 模式&#xff1a;将WEB工程以包的形式上传到服务器 &#xff1b;war exploded 模式&#xff1a;将WEB工程以当前文件夹的位置…...

Delphi IdTcpServer IdTcpClient 传输简单文本

Delphi IdTcpServer IdTcpClient 传输简单文本 已经很久敲代码了&#xff0c;想找一段直接Delphi11 TCP简单文本传输&#xff0c;费劲&#xff01;FStringStream 、FStrStream &#xff1a; FStringStream:TStringStream.Create(,TEncoding.UTF8); 已经很久敲代码了&#xff0c…...

界面控件Telerik UI for WPF——Windows 11主题精简模式提升应用体验

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。Telerik UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visua…...

PoseC3D 基于人体姿态的动作识别新范式

摘要1. Introduction2. Related Work动作识别 3D-CNN基于骨架的动作识别 GCN基于骨骼的动作识别 2D-CNN3. Framework3.1. Good Practice for Pose Extraction3.2. From 2D Poses to 3D Heatmap Volumes3.3 基于骨骼的动作识别 3D-CNNPose-SlowOnlyRGBPose-SlowFast4. Experimen…...

html2canvas 截图空白 或出现toDataURL‘ on ‘HTMLCanvasElement或img标签没截下来 的所有解决办法

1.如果截图空白&#xff1a; 1.1以下的参数是必须要有的。 width: shareContent.offsetWidth, //设置canvas尺寸与所截图尺寸相同&#xff0c;防止白边height: shareContent.offsetHeight, //防止白边logging: true,useCORS: true,x:0,y:0,2&#xff0c;如果出现了报错 toData…...

Eclipse错误提示: Symbol ‘xxxx‘ could not be resolved

问题现象&#xff1a; 调试FPGA时&#xff0c;如果在qsys中增加新的内容&#xff0c;到nios中编译的时候就会提示找不到宏定义。 而这些宏定义都是在system.h这个头文件中的&#xff0c;原来的宏定义都能找到&#xff0c;就是新增的找不到&#xff0c;这个应该和头文件路径没有…...

基于Java的OA办公管理系统,Spring Boot框架,vue技术,mysql数据库,前台+后台,完美运行,有一万一千字论文。

基于Java的OA办公管理系统&#xff0c;Spring Boot框架&#xff0c;vue技术&#xff0c;mysql数据库&#xff0c;前台后台&#xff0c;完美运行&#xff0c;有一万一千字论文。 系统中的功能模块主要是实现管理员和员工的管理&#xff1b; 管理员&#xff1a;个人中心、普通员工…...

正则表达式(JAVA)

正则表达式(JAVA) 文章目录 正则表达式(JAVA)用法字符类(只匹配一个字符)预定义字符(只匹配一个字符)数量词贪婪爬取符号捕获分组规则捕获分组符号 非捕获分组案例忽略大小写 用法 正则表达式在用于校验信息是否满足某些规则的时候,非常的好用 在文本中查找满足要求的内容 字…...

264_BOOST中的Json库解析_BOOST_AUTO(itrpromodel, doc.FindMember(“productmodel“));

BOOST_AUTO(itrpromodel, doc.FindMember("productmodel"));if(itrpromodel != doc.MemberEnd()){BOOST_AUTO(iterd_url...

linux rpm 离线安装 nginx 自用,仅供参考

检查是否安装nginx ps -ef|grep nginx 检查rpm是否安装nginx rpm -qa|grep nginx 查看linux centos 发行版本 cat /etc/centos-release (查看其它发现版本 就把centos替换为别的 比如 红旗的 redflag ) 查看cpu信息 x86_64 lscpu 检查nginx所需依赖 …...

第十二章 YOLO的部署实战篇(上篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...

无涯教程-Android - List View函数

Android ListView 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…...

stable diffusion实践操作-重绘

系列文章目录 本文专门开一节写局部重绘相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、局…...

C# 静态构造函数未执行 .net core框架

代码如下&#xff0c;在执行Encoding.GetEncoding(“gb2312”);方法后报错&#xff0c;说没有找到对应编码&#xff0c;经测试&#xff0c;发现是静态构造函数未执行。 public static class Encodings {/// <summary>/// 注册相关编码/// </summary>static Encodi…...

Java 复习笔记 - 学生管理系统篇

文章目录 学生管理系统一&#xff0c;需求部分需求分析初始菜单学生类添加功能删除功能修改功能查询功能 二&#xff0c;实现部分&#xff08;一&#xff09;初始化主界面&#xff08;二&#xff09;编写学生类&#xff08;三&#xff09;编写添加学生方法&#xff08;四&#…...

【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】

一、今天我们来学习三个东西 1.UIPickerView-UIDatePicker-应用程序对象 1.首先,来看数据选择控件 数据选择控件, 大家对这个数据选择控件,是怎么理解的, 1)数据选择控件,首先,是不是得有数据, 2)然后呢,你还得让用户能够选择, 3)最后,你还得是一个控件儿 那…...

SDMatte Web服务灰度发布:新模型版本AB测试与用户反馈闭环机制

SDMatte Web服务灰度发布&#xff1a;新模型版本AB测试与用户反馈闭环机制 1. 引言 在AI图像处理领域&#xff0c;模型迭代更新是持续提升服务质量的必经之路。SDMatte作为一款专注于高质量图像抠图的AI模型&#xff0c;近期完成了新版本SDMatte的研发工作。本文将详细介绍我…...

别再死记硬背了!用Python和SymPy库5分钟可视化理解泰勒公式的逼近过程

用Python动态可视化泰勒公式&#xff1a;5行代码理解多项式逼近本质 数学公式的抽象性常常成为学习者的障碍&#xff0c;尤其是泰勒公式这种涉及无限逼近概念的内容。传统的静态图示和理论推导虽然严谨&#xff0c;却难以直观展示"以直代曲"的动态过程。本文将用Pyth…...

用快马AI快速原型设计:9·1免费素材库管理界面十分钟搭建指南

最近在帮朋友设计一个免费素材库的管理界面&#xff0c;需求是要快速搭建一个能展示"91免费素材"的网页应用。作为一个经常需要验证设计想法的开发者&#xff0c;我发现用InsCode(快马)平台可以大大缩短原型开发时间。下面分享下我是如何在十分钟内完成这个素材库管理…...

[路径保护]解决中文路径乱码:从名称错乱到Unicode支持的实践指南

[路径保护]解决中文路径乱码&#xff1a;从名称错乱到Unicode支持的实践指南 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文&#xff08;中文&#xff09;命名 项…...

用MATLAB从零实现六足机器人步态:交替三角与波动步态代码详解

用MATLAB从零实现六足机器人步态&#xff1a;交替三角与波动步态代码详解 六足机器人因其卓越的稳定性和地形适应能力&#xff0c;在野外勘探、灾难救援等领域展现出巨大潜力。而步态规划作为机器人运动控制的核心&#xff0c;直接决定了机器人的移动效率和稳定性。本文将带您从…...

零基础养龙虾:OpenClaw部署从入门到上手,一篇讲透!

2026年&#xff0c;OpenClaw&#xff08;昵称 “龙虾”&#xff09;凭借 “能真正动手干活” 的核心能力&#xff0c;成为开源AI Agent领域的顶流。它不仅能像ChatGPT一样聊天&#xff0c;更能自主操作电脑——整理文件、控制浏览器、发送邮件、甚至调用硬件设备。因其图标酷似…...

掌握 AgentScope 与 Spring AI Alibaba:大模型多智能体实践指南(收藏版)

本文深入探讨了 AgentScope 与 Spring AI Alibaba 在大模型应用中的多智能体实践。从单智能体优先原则出发&#xff0c;详细解析了 Pipeline、Routing、Skills、Subagents、Supervisor、Handoffs 及 Custom Workflow 等多种多智能体模式&#xff0c;并提供了实用的架构选型指南…...

springboot框架健康饮食营养管理信息系统

目录需求分析与系统设计技术栈选型与环境搭建核心功能实现数据可视化与报告生成测试与部署项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与系统设计 明确健康饮食营养管理系统的核心需求&#xff0c;包括用户注册登录…...

Anaconda Prompt卡在solving environment?别慌,三步搞定清华镜像源配置(附.condarc文件)

Anaconda环境配置卡顿&#xff1f;清华镜像源优化全指南 刚接触Python数据科学的新手们&#xff0c;十有八九会在Anaconda环境配置这一步栽跟头。特别是当看到命令行窗口里"solving environment"的提示一直转圈却迟迟没有进展时&#xff0c;那种等待的煎熬简直让人抓…...

高效安全:从远程服务器到本地Windows的文件传输全攻略

1. 远程桌面连接&#xff1a;最直观的文件传输方式 远程桌面连接&#xff08;RDP&#xff09;是Windows系统自带的"杀手级"功能&#xff0c;我帮客户部署项目时90%的场景都会用它传文件。它的优势在于操作可视化程度高&#xff0c;就像直接在服务器桌面上操作本地文件…...