pytest tidak mengakui ketergantungan PASSED di kelas dasar menghasilkan tes SKIPPED di kelas turunan

Saya memiliki proyek kecil di mana saya menggunakan pytest dan pytest-dependency dengan tox untuk mengembangkan tes integrasi pada beberapa kode. Sampai saat ini saya menggunakan satu kelas dasar (BTestClass) dengan beberapa tes umum di direktori root dan tes khusus untuk setiap komponen kode di test_Component.py file di sebelahnya mengimplementasikan kelas TestC yang mewarisi dari BTestClass.

Semuanya bekerja dengan baik sampai saat itu. Sekarang saya ingin menambahkan BTestClass2 untuk kumpulan komponen lainnya. Jadi saya menambahkan lapisan warisan lain, tetapi sekarang tidak berfungsi, pytest memvalidasi pengujian A umum tetapi kemudian melewatkan pengujian yang bergantung padanya. Saya tidak tahu kenapa.

Berikut tata letak sistem file:

λ tree /F
Folder PATH listing
Volume serial number is F029-7357
C:.
│   B.py
│   requirements-tox.txt
│   tox.ini
│
├───app_C
│   └───tests
│           test_C.py
│
└───common
        A.py

common\A.py

import pytest


class ATestClass():

    @pytest.mark.dependency(name='test_a')
    def test_a(self):
        assert True

B.py

import pytest
from common.A import ATestClass


class BTestClass(ATestClass):

    @pytest.mark.dependency(name='test_b', depends=['test_a'])
    def test_b(self):
        assert True

test_C.py

import pytest
import sys


sys.path.append('.')
from B import *


class TestC(BTestClass):

    @pytest.mark.dependency(name='test_c', depends=['test_b'])
    def test_c(self):
        assert True

keluaran pytest:

λ tox -- -rs
py38 installed: ...
py38 run-test-pre: PYTHONHASHSEED='367'
py38 run-test: commands[0] | pytest -x -v -rs
=============================================== test session starts ===============================================
platform win32 -- Python 3.8.1, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- ...\poc\.tox\py38\scripts\python.exe
cachedir: .tox\py38\.pytest_cache
rootdir: ...\poc
plugins: dependency-0.5.1
collected 3 items

app_C/tests/test_C.py::TestC::test_b SKIPPED                                                                 [ 33%]
app_C/tests/test_C.py::TestC::test_c SKIPPED                                                                 [ 66%]
app_C/tests/test_C.py::TestC::test_a PASSED                                                                  [100%]
============================================= short test summary info =============================================
SKIPPED [1] .tox\py38\lib\site-packages\pytest_dependency.py:103: test_b depends on test_a
SKIPPED [1] .tox\py38\lib\site-packages\pytest_dependency.py:103: test_c depends on test_b
===================================== 1 passed, 2 skipped, 1 warning in 0.14s =====================================
_____________________________________________________ summary _____________________________________________________
  py38: commands succeeded
  congratulations :)

Tahu mengapa test_b dilewati dan tidak dieksekusi?

Sunting: Jika saya membuat BTestClass mandiri, menghapus A / ATestClass dari gambar, itu berfungsi dengan baik.

collected 2 items

app_C/tests/test_C.py::TestC::test_b PASSED [ 50%]
app_C/tests/test_C.py::TestC::test_c PASSED [100%]

person DaLynX    schedule 13.10.2020    source sumber
comment
Tampaknya Anda memiliki konten test_C.py di common\A.py - kesalahan salin dan tempel?   -  person MrBean Bremen    schedule 13.10.2020
comment
Ya, dikoreksi, terima kasih.   -  person DaLynX    schedule 13.10.2020


Jawaban (1)


Di pytest-dependency, ketergantungan pada pengujian lain menyiratkan bahwa pengujian tersebut berjalan sebelum pengujian dependen. Jika bukan itu masalahnya (dalam contoh Anda test_b dijalankan sebelum test_a, karena test_a terletak di subdirektori), pengujian akan dilewati begitu saja. pytest-dependency tidak melakukan penyusunan ulang tes apa pun (sayangnya).

Jika Anda tidak dapat dengan mudah menetapkan urutan pengujian yang dijalankan melalui penamaan, Anda dapat menggunakan pytest-ordering plugin untuk membawa tes ke dalam urutan yang diperlukan. Dalam kasus Anda, Anda dapat melakukan:

class ATestClass:
    @pytest.mark.dependency(name='test_a')
    @pytest.mark.run(order=0)
    def test_a(self):
        assert True
...
class BTestClass(ATestClass):
    @pytest.mark.dependency(name='test_b', depends=['test_a'])
    @pytest.mark.run(order=1)
    def test_b(self):
        assert True

Dalam hal ini, pengujian dijalankan dalam urutan test_a - test_b - test_c, dan semua pengujian akan dijalankan.

PEMBARUAN:
Anda juga dapat menggunakan pytest -order, yang merupakan cabang dari pytest-ordering. Jika Anda menggunakan opsi pytest --order-dependencies ia akan mencoba mengurutkan ulang pengujian dengan dependensi yang dibuat oleh pytest-dependencies, tanpa perlu menambahkan tanda tambahan.

Penafian: Sayalah pembuat fork itu.

person MrBean Bremen    schedule 16.10.2020