『Python』pytest 单元测试迅速上手 (for Pycharm)

背景介绍
进行项目交付之前,甲方通常需要开发者保证项目代码的测试覆盖率达到某个值,为此我们需要为项目中的代码编写相应的单元测试,然后把代码提交到 C I CI CI 工具,运行 p i p e i l n e pipeilne pipeilne 并得到单元测试(后面简称 U T UT UT)代码对项目代码的覆盖率
在项目开发的过程中,若可以确定某部分代码在未来不怎么会改动,就可以为这部分代码写 U T UT UT 代码了


写 U T 前 的 准 备 工 作 写UT前的准备工作 UT

一、文件夹创建

U T UT UT 单独创建一个文件夹 t e s t s tests tests,用于存放单元测试需要用到的所有东西
在这里插入图片描述

二、创建测试文件

存放 U T   c o d e UT \space code UT code p y py py 文件个人习惯以 ‘ t e s t test test_’ 开头
比如我想为项目代码里的 l o g i c logic logic U T   c o d e UT \space code UT code ,那就可以创建一个这样的文件:
在这里插入图片描述

三、安装 p a c k a g e package package

在这里插入图片描述

# Cmd code in Anaconda Prompt(Anaconda3):
pip install pytest==6.2.4
pip install pytest-cov==2.11.1

开 始 编 写 U T   c o d e 开始编写UT \space code UT code

U T   c o d e UT \space code UT code 的目的,实际上就是验证某个代码块(通常为函数)的输出是否符合我们的预期。其中用到的核心方法是 assert,若输出与预期相符,则该测试函数就能成功覆盖项目代码中使用到该代码块的区域

一个简单的例子:
比如在项目代码中使用了这样的函数:
def sum_two_number(a, b):
    result = a + b
    return result

那么相应的测试函数可以为:
def test_sum_two_number():
    a = 3
    b = 2
    expected_num = 5
    output = sum_two_number(a, b)
    assert expected_num == output


写 U T   c o d e 可 以 参 考 的 一 些 思 想 写 UT \space code 可以参考的一些思想 UT code

一、针对没有返回对象的函数

d e v e l o p m e n t development development 阶段,项目内的一些函数并不需要任何代码层面的输出,比如不需要 r e t u r n return return 一个变量但是可能会在 l o c a l local local 生成文件,对于这种函数,在你确保它肯定能正常运行(工期很赶 )的前提下,可以简单粗暴地在测试函数中调用该函数,然后在测试函数的结尾直接 a s s e r t   T r u e assert \space True assert True
在这里插入图片描述
🔺:在被测函数能正常运行的前提下,这似乎是万能的方法,不过别人在看你的 U T   c o d e UT \space code UT code时会一脸懵逼 😛,除非真的是逼不得已要提高覆盖率或者某个函数很易懂没必要浪费精力去写,不然还是不建议这样写的
当然如果该函数生成了一个文件,那也可以选择使用 assert Path(file_path).exists() 进行简单验证


二、生成DataFrame的中间函数

这种函数的测试方法就很多了,可以视情况而定,基本思想是利用 d f df df 的属性( s h a p e 、 c o l u m n shape、column shapecolumn等)进行验证

  • 若确定它的行数是固定的,直接assert len(df) == row_number即可;
  • 若确定它的 c o l u m n column column 不变,可以在测试函数中直接 h a r d c o d e hardcode hardcode 一个列表(columns_list),然后assert df.columns.tolist() == columns_list即可

当然以上都是比较粗粒度层面的验证,仅作为思路提供


三、有多个输出的函数

由于一个测试函数只能存在一个 a s s e r t assert assert,但我们希望在一个测试函数内尽量把所有输出都覆盖,那可以通过元组同时验证这些输出:
output_1, output_2 = function_1()
assert (output_1, output_2) == (expected_1, expected_2)


如 何 在 本 地 终 端 运 行 U T 代 码 如何在本地终端运行UT代码 UT

一、运行某个测试文件下的所有测试函数

python -m pytest 测试文件夹/测试函数文件

python -m pytest tests/tests_logic.py
在这里插入图片描述

二、运行某个测试文件下的单个测试函数(类)

python -m pytest 测试文件夹/测试函数文件/测试类(测试函数)

python -m pytest tests/test_logic.py::class(function)

三、查看某个测试文件对某文件夹的测试覆盖率

该命令运行结束后会在项目文件夹下生成一个名为 h t m l c o v htmlcov htmlcov 的文件夹,里面包含多个 h t m l html html 格式的报告,从 i n d e x . h t m l index.html index.html 进入,能方便地查看自己编写的测试函数覆盖了项目代码的哪些区域以及各个区域的覆盖率:

python -m pytest --cov=要看覆盖率的文件夹 测试文件夹/测试函数文件 --cov-report=html

python -m pytest --cov=src tests/test_logic.py --cov-report=html

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值