对于每一个项目,无论是软件开发还是数据应用程序都是由后端的预测模型驱动的,最终产品的质量取决于团队在产品生命周期的各个阶段所进行的严格测试。测试工程师努力在产品发布之前发现它们,但它们总是悄悄地出现,而且它们经常重复出现,即使是最好的手动测试过程,这些问题也有时是非常琐碎的,而手动测试过程中却没有发现这些问题。唯一的方法就是自动化这个过程。
有很多使用开源平台/库的方法,这些平台/库易于使用,与你的版本控制、云环境无缝集成,尤其是对于数据科学项目,团队规模通常很小,可能没有专门的测试团队或技能来使用第三方工具构建自动化脚本。
在本博客中,我们将探讨Pytest——一个python库,它定义了你的业务规则,并自动化了测试用例和GitHub操作,以创建自动化的工作流来自动化流程。
我们将在下一节中介绍以下主题:
•Pytest概述•GitHub操作及其配置简介•用例的实现•结果和结论
你将需要python的基础知识和GitHub帐户。我将使用visual studio作为编辑器;你可以使用你熟悉的任何编辑器。
我们将使用来自Analytics Vidhya的hackathon的贷款预测数据集。
•https://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction-iii/#ProblemStatement
为典型的web开发项目编写单元测试用例是正常的,但是一般来说,在数据探索或质量检查的情况下,有一种倾向是先跳过并在最后手动完成。
Pytest库使配置测试用例、编写函数以测试特定的输入和输出变得更容易。简而言之,在将代码推送到QA/prod环境之前,只需编写一次并继续运行测试。有关更多详细信息,请参阅Pytest文档。
让我们按名称创建一个文件 loan_test.py,导入库,加载数据集并将其分配给对象:
# Load the librariesimport pandas as pdimport pytest# Load the datadf = pd.read_csv("train.csv")
在继续测试用例之前,让我们快速查看一下数据及其结构。
df.head()df.describe()
现在我们已经有了所需的库和加载的数据。首先,让我们确定一些有意义的验证。
1.列的数量、名称和顺序应按照定义的过程进行。2.性别只能有两种可能的值,要么是男性,要么是女性。3.“已婚”列只能有两个类别“是”或“否”。4.地区可以有三个值:农村、城市或半城市。5.贷款期限不得超过600。
是时候把这些规则翻译成代码了。我们将定义一个名为test_Gender()的函数,并检查数据集中的值是否有这两个值。如果是,测试用例将通过,如果不是,测试用例将失败。这是通过使用assert关键字测试我们的标准来实现的。我们将遵循类似的结构并定义所有其他情况,如下所示。
# Test to check if the Gender has only Male or Femaledef test_Gender(): assert df['Gender'].unique().tolist() == ['Male', 'Female']
#Test for checking if the Married columns has only two values either Yes or Nodef test_Married(): assert df['Married'].unique().tolist() == ['Yes','No']
# Test for checking if Applicant Income is less than zerodef test_ApplicantIncome(): assert df[df['ApplicantIncome'] < 0].shape[0] == 0
#Test for checking if the Married columns has only two values either Male or Femaledef test_PropertyArea(): assert df['Property_Area'].unique().tolist() == ['Rural','Urban','Semiurban']
# Test for checking if Loan Amount is more than 500def test_LoanAmountTerm(): assert df[df['Loan_Amount_Term'] > 600].shape[0] == 0
一旦开始编写案例,Pytest就会自动识别它们。如果你使用的是vscode,那么你将看到下面的测试用例。为了演示,我插入了一个导致一个测试用例失败的缺陷—— test_LoanAmountTerm
现在,通过在vscode中手动运行测试用例,我们已经成功地定义和检查了测试用例。在下一节中,我们将研究如何在具有GitHub操作的工作流下将这些测试用例与GitHub集成。
我们一直在使用GitHub进行版本控制,还可以跨团队和社区协作,但GitHub提供的不仅仅是一个代码库。GitHub操作特性可以帮助你在开发生命周期内自动化任务。它们是事件驱动的,这意味着你可以在指定事件发生后运行一系列命令。例如,每次有人将代码推送到存储库时,你都可以自动运行一个执行测试脚本的命令,在本例中,它将是我们在上一节中定义的Pytest脚本。
“再多的测试也不能证明一个软件是正确的;一次测试就可以证明一个软件是错误的。”—阿米尔·加哈雷
导航到你的GitHub存储库,你将能够看到如下所示的Actions选项卡。
在你的存储库中,创建.github/workflows/目录来存储你的工作流文件,即.yaml文件,该文件将包含以下部分。
1.打开:[push]以在每次向存储库推送代码时自动触发工作流。2.作业将工作流文件中运行的所有作业组合在一起。3.创建一个环境,其中所有依赖项都是从要求.txt文件。4.最后,一旦安装完成,我们调用pytest在新创建的环境中执行测试用例。
把它们放在一起,.yaml文件应如下所示。我们的重点将放在最后三行中,在那里我们将在GitHub环境中执行测试用例。
# This workflow will install Python dependencies, run tests and lint with a single version of Python# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actionsname: Automated Testing With Pyteston: 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: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pytest
一旦上述设置完成,对存储库的任何新更改/推送都将触发工作流,从而创建一个新的GitHub Ubuntu环境,安装所有依赖项并执行我们的测试用例。
正如你在控制台上看到的,yaml文件中定义的所有步骤都已设置,我们的六个测试用例以100%的通过率成功执行。
本文目的是展示Pytest/GitHub actions/vscode的功能,以及将日常执行的许多与数据相关的日常活动自动化是多么容易。你还可以使用更复杂的云平台,它具有高级功能,可以让你通过自动化实现类似的结果。但是,如果你的团队规模较小,预算有限,并且缺乏测试自动化技能,那么Pytest/GitHub就可以非常方便地完成你的项目目标。
我应用这种方法的一些场景:
1 我曾经从多个外部系统和团队接收定期数据。这样的自动化工作流程帮助我确保收到的数据符合约定的格式和数据质量。
2 该框架可用于测试模型结果,如果模型的性能比上一次迭代要好,那么模型将被推送到一个暂存环境中。如果没有,那么现有的模型将继续处于暂存环境中,并且我可以返回到带有参数调整和新功能等的模型上进行实验。
你可以找到代码供参考–Github:https://github.com/amitvkulkarni/Automated-Testing-With-Github-Actions