Akan menyenangkan untuk melakukan sesuatu seperti:
if settings.TESTING:
print("py.test is being ran")
"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
.
Komentar yang paling membantu
"pytest" in sys.modules
?