pytest ไม่ยอมรับการพึ่งพา PASSED ในคลาสพื้นฐานส่งผลให้มีการทดสอบ SKIPPED ในคลาสที่ได้รับ

ฉันมีโปรเจ็กต์เล็กๆ นี้ที่ฉันใช้ pytest และ pytest-dependency กับ tox เพื่อพัฒนาการทดสอบการรวมในโค้ดบางตัว จนถึงตอนนี้ ฉันใช้คลาสพื้นฐานหนึ่งคลาส (BTestClass) กับการทดสอบทั่วไปบางอย่างในไดเร็กทอรีราก และการทดสอบเฉพาะสำหรับแต่ละองค์ประกอบของโค้ดใน test_Component.py file ถัดจากคลาสนั้นโดยใช้คลาส TestC ที่สืบทอดมาจาก BTestClass

ทุกอย่างทำงานได้ดีจนกระทั่งตอนนั้น ตอนนี้ฉันต้องการเพิ่ม BTestClass2 สำหรับส่วนประกอบอีกชุดหนึ่ง ดังนั้นฉันจึงเพิ่มการสืบทอดอีกชั้นหนึ่ง แต่ตอนนี้มันใช้งานไม่ได้ pytest ตรวจสอบความถูกต้องของการทดสอบ A ทั่วไป แต่จากนั้นก็ข้ามการทดสอบที่ขึ้นอยู่กับมัน ฉันมีความคิดว่าทำไมไม่มี.

นี่คือเค้าโครงระบบไฟล์:

λ 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

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 :)

มีความคิดใดบ้างว่าทำไม test_b จึงถูกข้ามและไม่ดำเนินการ?

แก้ไข: หากฉันทำ BTestClass แบบสแตนด์อโลน โดยลบ A / ATestClass ออกจากรูปภาพ ก็ใช้งานได้ดี

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 แหล่งที่มา
comment
ดูเหมือนคุณจะมีเนื้อหาเป็น test_C.py ใน common\A.py - เกิดข้อผิดพลาดในการคัดลอกและวางใช่ไหม   -  person MrBean Bremen    schedule 13.10.2020
comment
ใช่ครับ แก้ไขแล้ว ขอบคุณครับ   -  person DaLynX    schedule 13.10.2020


คำตอบ (1)


ใน pytest-dependency การขึ้นต่อกันกับการทดสอบอื่นหมายความว่าการทดสอบนั้นรันก่อนการทดสอบตาม หากไม่เป็นเช่นนั้น (ในตัวอย่างของคุณ test_b ทำงานก่อน test_a เนื่องจาก test_a อยู่ในไดเรกทอรีย่อย) การทดสอบจะถูกข้ามไป pytest-dependency ไม่ได้ทำการเรียงลำดับการทดสอบใหม่ (น่าเสียดาย)

หากคุณไม่สามารถกำหนดลำดับการดำเนินการทดสอบผ่านการตั้งชื่อได้อย่างง่ายดาย คุณสามารถใช้ pytest-ordering ปลั๊กอินเพื่อนำการทดสอบไปตามลำดับที่ต้องการ ในกรณีของคุณคุณสามารถทำได้:

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

ในกรณีนี้ การทดสอบจะดำเนินการตามลำดับ test_a - test_b - test_c และการทดสอบทั้งหมดจะดำเนินการ

อัปเดต:
คุณยังสามารถใช้ pytest -order ซึ่งเป็นทางแยกของ pytest-ordering หากคุณใช้ตัวเลือก pytest --order-dependencies จะพยายามเรียงลำดับการทดสอบใหม่โดยมีการขึ้นต่อกันที่สร้างโดย pytest-dependencies โดยไม่จำเป็นต้องเพิ่มเครื่องหมายเพิ่มเติม

ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนทางแยกนั้น

person MrBean Bremen    schedule 16.10.2020