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 ==================================================

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

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

相关文章

我想开通期权?如何开通期权账户?

场内期权的合约由交易所统一标准化定制&#xff0c;大家面对的同一个合约对应的价格都是一致的&#xff0c;比较公开透明&#xff0c;期权开户当天不能交易的&#xff0c;期权开户需要满足20日日均50万及半年交易经验即可操作&#xff0c;下文科普我想开通期权&#xff1f;如何…

Java设计模式:四、行为型模式-10:访问者模式

一、定义&#xff1a;访问者模式 访问者模式&#xff1a;核心在于同一个事物不同视角下的访问信息不同。 在一个稳定的数据结构下&#xff0c;例如用户信息、雇员信息等&#xff0c;增加易变的业务访问逻辑。为了增强扩展性&#xff0c;将两部分的业务解耦的一种设计模式。 二…

详解 SpringMVC 中获取请求参数

文章目录 1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、[RequestParam ](/RequestParam )4、[RequestHeader ](/RequestHeader )5、[CookieValue ](/CookieValue )6、通过POJO获取请求参数7、解决获取请求参数的乱码问题总结 在Spring MVC中&#xff0c;获取请…

自建音乐播放器之一

这里写自定义目录标题 1.1 官方网站 2. Navidrome 简介2.1 简介2.2 特性 3. 准备工作4. 视频教程5. 界面演示5.1 初始化页5.2 专辑页 前言 之前给大家介绍过 Koel 音频流服务&#xff0c;就是为了解决大家的这个问题&#xff1a;下载下来的音乐&#xff0c;只能在本机欣赏&…

【pyqt5界面化工具开发-12】QtDesigner图形化界面设计

目录 0x00 前言 一、启动程序 二、基础的使用 三、保存布局文件 四、加载UI文件 0x00 前言 关于QtDesigner工具的配置等步骤&#xff08;网上链接也比较多&#xff09; 下列链接非本人的&#xff08;如果使用pip 在命令行安装过pyqt5以及tools&#xff0c;那么就可以跳过…

springboot整合SpringSecurity

先写了一个配置类 给这个访问路径&#xff0c;加上角色权限 package com.qf.config;import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; impo…

【网络编程上】

目录 一.什么是互联网 1.计算机网络的定义与分类&#xff08;了解&#xff09; &#xff08;1&#xff09;计算机网络的定义 &#xff08;2&#xff09;计算机网络的分类 ① 按照网络的作用范围进行分类 ②按照网络的使用者进行分类 2.网络的网络 &#xff08;理解&#xf…

苹果Mac系统如何优化流畅的运行?提高运行速度

Mac系统的稳定性和流畅性一直备受大家称赞&#xff0c;这也是大多数人选择Mac的原因&#xff0c;尽管如此&#xff0c;我们仍不时地对Mac进行优化、调整&#xff0c;以使其比以前更快、更流畅地运行。以下是小编分享给各位的Mac优化方法&#xff0c;记得保存哦~ 一、释放被过度…

【笔记】常用 js 函数

数组去重 Array.from(new Set()) 对象合并 Object.assign . 这里有个细节&#xff1a;当两个对象中含有key相同value不同时&#xff0c;会以 后面对象的key&#xff1a;value为准 保留小数点后几位 toFixed 注意&#xff1a; Number型&#xff0c;用该方法处理完&#xff0c;会…

Markdown Preview Plus Chrome插件使用

Markdown Preview Plus Chrome插件使用 1.插件说明2.插件下载3.插件配置4.文档样式4.1 网页显示4.2 导出PDF 系统&#xff1a;Win10 Chrome&#xff1a;113.0.5672.127 Markdown Preview Plus&#xff1a;0.7.3 1.插件说明 一般 markdown 工具自带的预览功能比较简单&#xff…

触发JVM fatal error并配置相关JVM参数

1. 絮絮叨叨 工作中&#xff0c;Java服务因为fatal error&#xff08;致命错误&#xff0c;笔者称其为jvm crash&#xff09;&#xff0c;在服务运行日志中出现了致命错误的概要信息&#xff1a; # # A fatal error has been detected by the Java Runtime Environment: # # S…

【力扣每日一题03】数组篇--移除元素

坚持日更第三天&#xff0c;习惯逐渐养成了&#xff0c;这两天都期待着每日的刷题写博客环节~ 一、题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必…

RTPEngine 通过 HTTP 获取指标的方式

文章目录 1.背景介绍2.RTPEngine 支持的 HTTP 请求3.通过 HTTP 请求获取指标的方法3.1 脚本配置3.2 请求方式 1.背景介绍 RTPEngine 是常用的媒体代理服务器&#xff0c;通常被集成到 SIP 代理服务器中以减小代理服务器媒体传输的压力&#xff0c;其架构如下图所示。这种使用方…

PHP数组处理$arr1转换为$arr2

请编写一段程序将$arr1转换为$arr2 $arr1 array( 0>array (fid>1,tid>1,name>Name1), 1>array (fid>2,tid>2,name>Name2), 2>array (fid>3,tid>5,name>Name3), 3>array (fid>4,tid>7,name>Name4), 4>array (fid>5,tid…

lightdb 支持兼容Oracle的to_clob函数

文章目录 概述案例演示 概述 在信创移植的SQL语句中&#xff0c;有来源于Oracle数据库的SQL语句。 在ORACLE PL/SQL包中&#xff0c;你可以使用TO_CLOB(character)函数将RAW、CHAR、VARCHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB值转换为CLOB。 因此在LightDB 23.3版本中实现了…

C# 实现浏览器控件设置

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System

人工智能论文通用创新点(一)——ACMIX 卷积与注意力融合、GCnet(全局特征融合)、Coordinate_attention、SPD(可替换下采样)

1.ACMIX 卷积与注意力融合 论文地址:https://arxiv.org/pdf/2111.14556.pdf 为了实现卷积与注意力的融合,我们让特征图经过两个路径,一个路径经过卷积,另外一个路径经过Transformer,但是,现在有一个问题,卷积路径比较快,Transformer比较慢。因此,我们让Q,K,V通过1*1的…

jmeter 线程组

在jmeter中&#xff0c;通过指定并发数量、启动延迟时间和持续时间&#xff0c;并组织示例&#xff08;Samplers&#xff09;在多个线程之间的执行方式&#xff0c;实现模拟并发用户的行为。 添加线程组&#xff1a; 在测试计划中&#xff0c;右键点击“添加” -> “Thread…

Android 1.1 背景相关与系统架构分析

目录 1.1 背景相关与系统架构分析 分类 Android 基础入门教程 1.Android背景与当前的状况 2.Android系统特性与平台架构 系统特性&#xff1a; 平台架构图&#xff1a; 架构的简单理解&#xff1a; 3.本节小结&#xff1a; 1.1 背景相关与系统架构分析 分类 Android 基础…

服务器数据恢复-vmware ESXI虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 从物理机迁移一台虚拟机到ESXI&#xff0c;迁移后做了一个快照。该虚拟机上部署了一个SQLServer数据库&#xff0c;存放了5年左右的数据。ESXI上有数十台虚拟机&#xff0c;EXSI连接了一台EVA存储&#xff0c;所有的虚拟机都在EVA存储上。 服务…