PySpark自动化测试关注点

Overview

之前一直使用scala写spark pipeline,这次试着使用PySpark来模拟,主要希望熟悉一下Python的自动化测试的文件组织、mock用法、三种verification方法、code Linting,以及docker化prd-code。

文件结构

可以不用跟golang一样与prd-code在同一个目录下。当然也可以这样做。但是单独一个test目录可能会更清晰。

test

我用过的测试部分是unittest和pytest,而在Python3里面,unittest好像有了长足进步,可以灵活配置,可以mock等等,而且是built-in的。

验证

常用的验证是跑ut来confirm,这里使用了三种方式,

  1. 常规unit test
    • 可以直接在IDEA跑的 image
  2. local container
    • 在本地起一个container,然后在container里面配置所需环境,然后再运行ut
    • 隔离local环境,仅需要minimal环境,有利于deploy
    • 配置Dockerfile
    • 注意workdir
    • 可以使用docker build,直接把prd-code制作成一个image,然后将其发布,利用k8s来部署、分发和弹性伸缩 image
  3. gitlab ci/cd
    • remote container
    • 跟step2类似,只是从本地container切换为Gitlab Runner container
    • 配置.gitlab-ci.yml image

遇到的问题

  • Python环境
    • 与IDEA结合,通常用requirements.txt来管理lib,而Python与IDEA的结合可以是system级别的(共用lib),也可以是virtual级别的(隔离lib) image
    • 与Spark结合,有时候切换Python环境之后就跑不起来了,此时需要根据错误来定位解决问题
  • codebase差异
    • github没有gitlab的ci/cd,只能用类似Travis CI这样的来代替,但是这样一来就需要使用Travis CI的语法来适配.gitlab-ci.yml
    • 刚刚看到,其实github也推出了自己的ci/cd服务,叫GitHub Action,其中Spark也切换过来了
      • 此时,我也把这个项目的ci使用GitHub Page run起来了 image

Reference

  1. PYTHON - AUTO GENERATE REQUIREMENTS.TXT
  2. How to enable or disable GitLab CI/CD
  3. Setting Up GitLab CI for a Python Application
  4. Building Minimal Docker Containers for Python Applications
  5. Dockerize your Python Application
  6. pyspark crash issue 1
  7. pyspark col function not found issue
  8. CI/CD using GitHub Action - example
  9. my source code