无论是软件开发还是数据应用,后端的预测模型对最终产品的质量起着决定性作用。测试工程师在产品发布前努力发现问题,但问题总是悄然出现,即使是最好的手动测试流程也无法完全避免。有时这些问题非常基础,却在手动测试中被遗漏。唯一的解决方案是自动化测试流程。
可以使用开源平台/库,这些平台/库易于使用,能够无缝集成到版本控制和云环境中,尤其适合数据科学项目。在这些项目中,团队规模往往较小,可能没有专门的测试团队或技能来构建自动化测试脚本和第三方工具。
在典型的Web开发项目中编写单元测试案例很常见,但在数据探索或质量检查的情况下,人们倾向于跳过并手动进行测试。Pytest库使得配置测试案例、编写函数以测试特定输入和输出变得更加简单。简而言之,只需编写一次,然后在将代码推送到QA/生产环境之前持续运行测试。
创建一个名为loan_test.py的文件,导入库,加载数据集并将其分配给对象df:
import pandas as pd
import pytest
df = pd.read_csv("train.csv")
在进行测试案例之前,先快速查看数据及其结构:
df.head()
df.describe()
现在已经加载了所需的库和数据,让确定一些有意义的验证规则。
将这些规则转化为代码。将定义一个名为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进行版本控制,也用于跨团队和社区的协作,但GitHub提供的不仅仅是代码仓库。GitHub Actions功能可以帮助自动化开发生命周期中的任务。它们是事件驱动的,这意味着可以在指定事件发生后运行一系列命令。例如,每次有人将代码推送到仓库时,可以自动运行一个命令来执行测试脚本,在这种情况下,它将是之前定义的Pytest脚本。
导航到GitHub仓库,将能够看到Actions标签。在仓库中,创建.github/workflows/目录以存储工作流文件,即.yaml文件,它将包含以下部分:
将所有内容整合在一起,.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非常有用,可以帮助实现项目目标。
以下是应用这种方法的一些场景:
祝学习愉快!