Pytest-django: Menyediakan cara untuk mendeteksi jika Django menjalankan tes

Dibuat pada 6 Mei 2016  ·  9Komentar  ·  Sumber: pytest-dev/pytest-django

Akan menyenangkan untuk melakukan sesuatu seperti:

if settings.TESTING:
    print("py.test is being ran")

Komentar yang paling membantu

"pytest" in sys.modules ?

Semua 9 komentar

"pytest" in sys.modules ?

Anda dapat menambahkan pengaturan sendiri dengan file pengaturan terpisah untuk pengujian

Saya pikir pendekatan yang disarankan oleh @blueyed dan @adamchainz harus cukup jika ini diperlukan. Umumnya, mengubah cara kerja kode Anda dengan mengintrospeksi apakah kode dipanggil dari pengujian atau tidak, tidak disarankan. Jika ini harus dilakukan, itu bisa dilakukan dengan cara pytest umum (tidak terlalu spesifik untuk pytest-Django). Terima kasih atas sarannya, jangan ragu untuk membuka kembali masalah ini jika Anda memiliki informasi tambahan dalam masalah ini!

Contoh yang relevan dari pytest docs Deteksi jika dijalankan dari dalam pytest run :

# content of conftest.py

def pytest_configure(config):
    import sys
    sys._called_from_test = True

def pytest_unconfigure(config):
    import sys
    del sys._called_from_test

Masalahnya adalah pytest_configure dijalankan setelah settings.py . Apakah ada cara untuk menjalankan kode ini sebelum settings.py ?

@axil
Apa yang salah dengan menggunakan 'pytest' in sys.modules ?

Hmm, ya, berhasil, meskipun itu terlihat agak rumit bagi saya.

Cara cepat dan kotor lainnya untuk memeriksa ini di settings.py adalah

TESTING = os.path.basename(sys.argv[0]) in ('pytest', 'py.test')

@axil
Apa yang salah dengan menggunakan 'pytest' in sys.modules ?

Fakta pytest diimpor tidak berarti bahwa pytest sedang berjalan dan kode dipanggil dari pengujian. Pada dasarnya, satu impor saya pytest untuk sesuatu yang lain. Juga pytest mengimpor pytest bahkan jika itu hanya menampilkan bantuan CLI: pytest --help

Berikut ini adalah kasus penggunaan yang sangat valid:
Saya memiliki pengaturan Django yang dapat dikonfigurasi dengan file dan variabel lokal tempat meletakkan berbagai kredensial dan konfigurasi dev env lokal lainnya. Tetapi saya ingin unittests saya tidak pernah menggunakan kredensial ini atau pengaturan khusus untuk tidak menggunakannya secara tidak sengaja pada beberapa sistem nyata (jika diejek dengan tidak benar) atau lulus/gagal pada konfigurasi dev env lokal. Karenanya saya ingin pengaturan lokal ini dikecualikan ketika dijalankan dengan pytest.

Saya memiliki sesuatu seperti:

import os
import os.path
import sys

from split_settings.tools import include, optional


def is_pytest_running():
    return (os.getenv('PYTEST_RUNNING') == 'true' or
            os.path.basename(sys.argv[0]) in ('pytest', 'py.test'))


ENVVAR_SETTINGS_PREFIX = 'MV_SERVER_'

local_settings_path = os.getenv(f'{ENVVAR_SETTINGS_PREFIX}SETTINGS', '../../../local/settings.py')

includes = [
    'base.py',
    'logging.py',
    'custom.py',
]

if not is_pytest_running():
    includes.append(optional(local_settings_path))
    includes.append('envvars.py')

include(*includes)

Menggunakan os.getenv('PYTEST_RUNNING') == 'true' adalah cara yang kurang lebih bersih, tetapi masalahnya adalah dengan menyetel variabel ini. Menyetelnya di conftest.py tidak berfungsi karena pytest-Django mengimpor pengaturan sebelum conftest.py dijalankan. Menyetelnya di commandline saat menjalankan pytest tidak nyaman dan juga menggagalkan tujuannya: jika seseorang lupa mengaturnya maka kredensial asli akan digunakan dari konfigurasi dev env lokal.

os.path.basename(sys.argv[0]) di ('pytest', 'py.test')

Saya harus mengubahnya menjadi os.path.basename(os.path.dirname(sys.argv[0])) in ('pytest', 'py.test') sejak sys.argv[0] keluar sebagai /home/project/venv/lib/python3.8/site-packages/pytest/__main__.py .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat