自动化测试实践:Pytest与GitHub Actions

无论是软件开发还是数据应用,后端的预测模型对最终产品的质量起着决定性作用。测试工程师在产品发布前努力发现问题,但问题总是悄然出现,即使是最好的手动测试流程也无法完全避免。有时这些问题非常基础,却在手动测试中被遗漏。唯一的解决方案是自动化测试流程。

可以使用开源平台/库,这些平台/库易于使用,能够无缝集成到版本控制和云环境中,尤其适合数据科学项目。在这些项目中,团队规模往往较小,可能没有专门的测试团队或技能来构建自动化测试脚本和第三方工具。

Pytest概览

在典型的Web开发项目中编写单元测试案例很常见,但在数据探索或质量检查的情况下,人们倾向于跳过并手动进行测试。Pytest库使得配置测试案例、编写函数以测试特定输入和输出变得更加简单。简而言之,只需编写一次,然后在将代码推送到QA/生产环境之前持续运行测试。

创建一个名为loan_test.py的文件,导入库,加载数据集并将其分配给对象df:

import pandas as pd import pytest df = pd.read_csv("train.csv")

在进行测试案例之前,先快速查看数据及其结构:

df.head() df.describe()

现在已经加载了所需的库和数据,让确定一些有意义的验证规则。

  • 列的数量、名称和顺序应符合定义的流程。
  • 性别只能有两个可能的值:男或女。
  • 婚姻状况列只能有两个类别:是或否。
  • 财产区域可以有三个值:农村、城市或郊区。
  • 贷款金额期限不应超过600。

将这些规则转化为代码。将定义一个名为test_Gender()的函数,检查数据集中的值是否符合这两个值。如果是,测试案例将通过;如果不是,测试案例将失败。这是通过使用assert关键字来测试标准实现的。将遵循类似的结构,并定义所有其他案例,如下所示:

def test_Gender(): assert df['Gender'].unique().tolist() == ['Male', 'Female'] def test_Married(): assert df['Married'].unique().tolist() == ['Yes', 'No'] def test_ApplicantIncome(): assert df[df['ApplicantIncome'] < 0].shape[0] == 0 def test_PropertyArea(): assert df['Property_Area'].unique().tolist() == ['Rural', 'Urban', 'Semiurban'] def test_LoanAmountTerm(): assert df[df['Loan_Amount_Term'] > 600].shape[0] == 0

一旦开始编写案例,Pytest会自动识别它们。如果使用的是vscode,将看到如下所示的测试案例。为了演示,插入了一个缺陷,导致一个测试案例失败——test_LoanAmountTerm。

GitHub Actions介绍及配置

一直在使用GitHub进行版本控制,也用于跨团队和社区的协作,但GitHub提供的不仅仅是代码仓库。GitHub Actions功能可以帮助自动化开发生命周期中的任务。它们是事件驱动的,这意味着可以在指定事件发生后运行一系列命令。例如,每次有人将代码推送到仓库时,可以自动运行一个命令来执行测试脚本,在这种情况下,它将是之前定义的Pytest脚本。

导航到GitHub仓库,将能够看到Actions标签。在仓库中,创建.github/workflows/目录以存储工作流文件,即.yaml文件,它将包含以下部分:

  • on: [push] 以在每次代码推送到仓库时自动触发工作流。
  • jobs将工作流文件中运行的所有作业组合在一起。
  • 创建一个环境,从requirements.txt文件中安装所有依赖项。
  • 最后,一旦设置完成,调用pytest在新创建的环境中执行测试案例。

将所有内容整合在一起,.yaml文件应该如下所示。重点将放在最后三行,在GitHub环境中执行测试案例。

name: Automated Testing With Pytest on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python 3.9 uses: actions/setup-python@v2 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with flake8 run: | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pytest

一旦上述设置完成,对仓库的任何新更改/推送将触发工作流,进而创建一个新的GitHub Ubuntu环境,安装所有依赖项并执行测试案例。

本博客的目的是展示Pytest/GitHub actions/vscode的功能,以及自动化许多日常数据相关活动是多么容易。还可以使用具有高级功能的更复杂的云平台,让实现类似的自动化结果,但如果团队规模较小,预算有限,缺乏测试自动化技能,那么Pytest/GitHub非常有用,可以帮助实现项目目标。

以下是应用这种方法的一些场景:

  1. 定期从多个外部系统和团队接收数据。这样的自动化工作流帮助确保接收到的数据符合约定的格式和数据质量
  2. 该框架可用于测试模型结果,如果模型的表现优于上一次迭代,则模型将被推送到暂存环境。如果没有,那么现有的模型将继续留在暂存环境中,可以回到模型上进行参数调整和新特性等实验。

祝学习愉快!

  • LinkedIn
  • GitHub
  • GitHub
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:15216758379