这一篇是即上一篇的 Python 测试程序-Jenkins 集成

1.Jenkins CI 持续集成
2.SonarQube 静态扫描
3.写了 Python 项目的单元测试
4.及单元测试覆盖率的统计

继续说明后面的 3 点,先说 Python 项目单元测试

单元测试

测试用例场景

参考资料

参数化

参考资料直接看这个链接,这里讲的不错

常见套路

某大神的文章

示例

SonarQube

代码静态分析

Java 语言 静态扫描说明
Python 语言 静态扫描说明

Docker Compose 安装

version: "3.7"
services:
  db:
    image: postgres
    container_name: postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
  sonarqube:
    image: sonarqube
    container_name: sonarqube
    restart: always
    ports:
      - "9000:9000"
    volumes:
#     mac 下根目录~
      - ~/sonarqube/conf:/opt/sonarqube/conf
      - ~/sonarqube/data:/opt/sonarqube/data
      - ~/sonarqube/logs:/opt/sonarqube/logs
      - ~/sonarqube/extensions:/opt/sonarqube/extensions
    links:
      - db
    environment:
      - sonar.jdbc.username=sonar
      - sonar.jdbc.password=sonar
      - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar

运行

测试


admin/admin 登录

安装 Python 语言插件(及中文包, 你懂的~😄)

SonarPython(安装完后重启,不然不能用)
中文包地址

单元测试&覆盖率统计&代码静态扫描

单元测试框架pyTest:allure 报告
覆盖率统计
官方资料 1
官方资料 2

策略

单元测试策略 从独立 到 业务耦合
utils > service > features/steps

命名

测试文件以 test_开头
测试类以 Test 开头
测试函数以 test_开头

如:
config_parser.py -> test_config_parser.py

集成 jenkins

安装 Jenkins 插件

allure report
SonarQube scanner

shell 执行脚本

#!/bin/bash
set -e
# 每个脚本都应该在文件开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出。
. /etc/profile.d/pyenv.sh
python --version
pyenv local 3.7.2
python --version
if [[ -f requirements.txt ]]; then
    pip install -r requirements.txt
fi
apt-get install -y pylint
# apt-get 默认安装路径 /usr/local/bin/

if [[ -d utest-results ]]; then
   rm -rf utest-results
fi
# 执行测试,设置代码覆盖率统计配置
pytest  --cov-config=setup.cfg --cov=. utest/ --alluredir utest-results

SonarQube 配置

sonar-scanner 调用 pylint, 然后将 单元测试覆盖率/ 静态扫描数据交给 sonar 服务器

sonar.projectKey=RestApiBDD
sonar.projectName=RestApiBDD
sonar.projectVersion=1.0
sonar.sources=.
sonar.language=py
sonar.sourceEncoding=UTF-8
# Test Results
#sonar.python.xunit.reportPath=utest-results
# Coverage
sonar.python.coverage.reportPath=coverage.xml
# sonar-scanner调用pylint静态骚麦哦,然后数据交给sonar服务器;
sonar.python.pylint=/usr/local/bin/pylint
sonar.python.pylint_config=.pylintrc
sonar.python.pylint.reportPath=./pylint-report.txt

邮件通知设置

结果

单元测试结果


静态扫描及单元测试覆盖率

代码覆盖率

静态扫描后发现的问题

自定义 质量/质量阀 代码规则配置




遇到的问题:

Q1. 因为是访问宿主机的 localhost,所以 SonarURL 不能用 localhost,要用实际 IP 或域名


↙↙↙阅读原文可查看相关链接,并与作者交流