Prueba de cobertura de Python dependiente de la plataforma con Tox
Última actualización el 20 de diciembre de 2020
Cuando se prueban programas Python, la cobertura.py se usa a menudo para medir la cobertura del código, y exigir una cobertura del código del 100% se considera una buena práctica:
# .coveragerc
[coverage:report]
# Enforce 100% coverage test
fail_under = 100
show_missing = True
Sin embargo, si hay líneas de código que dependen de la plataforma (es decir, que nunca se ejecutan en al menos una plataforma), las pruebas de cobertura de código generalmente fallan. Por ejemplo, el siguiente fragmento de código siempre da como resultado una cobertura inferior al 100 % en una plataforma que no sea Windows:
if os.name != 'nt':
# Do something if the OS is not Windows...
Puedes pedirle a cobertura.py que ignore este bloque agregando un comentario. # pragma: no cover
, pero luego cover.py lo ignora en todas las plataformas, incluidas todas las plataformas que no son Windows. Si utiliza un tóxico para realizar pruebas, este problema se puede resolver limpiamente.
Primero, marque el código Python que desea excluir con algunos comentarios de portada específicos de la plataforma:
if os.name != 'nt': # pragma: no cover windows. No execution of this branch on Windows
# Do something if the OS is not Windows...
Para exclusiones de Linux y MacOS, utilice # pragma: no cover linux
y # pragma: no cover macos
, respectivamente. Ahora intentaremos hacer que cover.py ignore estas líneas marcadas específicamente. Para el ejemplo anterior, haremos que cover.py ignore el bloque if marcado en Windows y solo en Windows.
filo tox.ini
agregue la siguiente parte para asegurarse de que esta configuración tox sea compatible con la plataforma (consulte la documentación tox para saber cómo funciona):
# tox.ini
[tox]
envlist = py{36,37,38,39}-{linux,macos,windows}
[testenv]
platform = linux: linux
macos: darwin
windows: win32
setenv =
linux: PLATFORM = linux
macos: PLATFORM = macos
windows: PLATFORM = windows
Luego, crea una plantilla. coveragerc
archivo, mencionado .coveragerc.in
incluyendo la siguiente sección junto con sus otras configuraciones de cobertura.py:
# .coveragerc.in
[coverage:report]
exclude_lines =
pragma: no cover {platform}
Estas líneas significan que cobertura.py debería ignorar una línea if pragma: no cover {platform}
está presente.
De regreso tox.ini
incluir las siguientes líneas:
# tox.ini
[testenv:py{36,37,38,39}-{linux,macos,windows}]
setenv =
COVERAGE_RCFILE = {envtmpdir}/coveragerc
commands_pre =
{envpython} -c 'from pathlib import Path; Path(r"{env:COVERAGE_RCFILE}").write_text(Path(".coveragerc.in").read_text().format(platform="{env:PLATFORM}"))'
commands =
coverage run -m pytest -v
Estas líneas son leídas por .coveragerc.in
sustituto {platform}
con el nombre de plataforma apropiado y escríbalo en un archivo temporal que cover.py reconozca como el archivo de configuración para esta ejecución.
Ahora, corriendo tox -e py39-windows
(u otras versiones de Python) ignorarán las líneas marcadas con # pragma: no cover windows
para fines de cobertura, y tox -e py39-linux
(u otras versiones de Python y OS) no ignorarán esas líneas.
Para ver un ejemplo en vivo, consulte el repositorio de código ejecutable de flake8, específicamente tox.ini
, .coveragerc.in
y el archivo fuente de Python con las marcas.