Apakah ada cara untuk menentukan tes pytest mana yang harus dijalankan dari file?

190

Apakah ada cara untuk memilih pytesttes untuk dijalankan dari file? Misalnya, file yang foo.txtberisi daftar tes yang akan dieksekusi:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

Atau, adakah cara untuk memilih beberapa tes, tidak memiliki pola umum dalam nama tes, dari direktori yang berbeda dengan pytest?

pytest -k <pattern> memungkinkan satu pola.

Salah satu pilihan adalah untuk pytest.markmenentang setiap pengujian, tetapi persyaratan saya adalah menjalankan kombinasi tes yang berbeda dari file yang berbeda.

Apakah ada cara untuk menentukan beberapa pola dan nama file uji untuk setiap pola?

Atau

Apakah ada cara untuk menentukan jalur pengujian yang tepat dalam file dan mengumpankan file itu sebagai input pytest?

Atau

Apakah ada fungsi pengait yang dapat digunakan untuk tujuan ini?

Sharad
sumber

Jawaban:

231

Anda dapat menggunakan -kopsi untuk menjalankan test case dengan pola berbeda:

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

Ini akan menjalankan test case dengan nama test_001 dan test_some_other_test membatalkan pilihan sisa test case.

Catatan: Ini akan memilih test case yang dimulai dengan test_001 atau test_some_other_test . Misalnya, jika Anda memiliki test case test_0012 itu juga akan dipilih.

supamaze
sumber
1
Terima kasih. Tetapi jika ada tes dengan nama yang sama di foo.py dan bar.py (katakanlah test_001), akhirnya akan dieksekusi dari keduanya.
Sharad
2
ya itu akan, hal apa pun yang cocok dengan pola akan dieksekusi seperti yang telah saya sebutkan dalam Catatan
supamaze
Tapi itu masalah bagiku. Saya ingin memilih tes mana yang akan dieksekusi dari file mana.
Sharad
@NamGVU `-k <test method name>`
supamaze
4
Seharusnyapy.test path/to/test/file.py -k function_name_test
LittleZero
91

Menentukan tes / memilih tes

Pytest mendukung beberapa cara untuk menjalankan dan memilih tes dari baris perintah.

Jalankan tes dalam sebuah modul

pytest test_mod.py

Jalankan tes dalam direktori

pytest testing/

Jalankan tes dengan ekspresi kata kunci

pytest -k "MyClass and not method"

Ini akan menjalankan tes yang berisi nama yang cocok dengan ekspresi string yang diberikan, yang dapat menyertakan operator Python yang menggunakan nama file, nama kelas, dan nama fungsi sebagai variabel. Contoh di atas akan berjalan TestMyClass.test_somethingtetapi tidak TestMyClass.test_method_simple.

Jalankan tes dengan id simpul

Setiap tes yang dikumpulkan ditugaskan unik nodeidyang terdiri dari nama file modul diikuti oleh penentu seperti nama kelas, nama fungsi dan parameter dari parametrization, dipisahkan oleh:: karakter.

Untuk menjalankan tes tertentu dalam modul:

pytest test_mod.py::test_func

Contoh lain menentukan metode pengujian di baris perintah:

pytest test_mod.py::TestClass::test_method

Jalankan tes dengan ekspresi marker

pytest -m slow

Akan menjalankan semua tes yang didekorasi dengan @pytest.mark.slowdekorator.

Untuk informasi lebih lanjut lihat tanda .

Jalankan tes dari paket

pytest --pyargs pkg.testing

Ini akan mengimpor pkg.testingdan menggunakan lokasi sistem file untuk menemukan dan menjalankan tes dari.

Sumber: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests

Amritpal Singh
sumber
the test_mod.py::TestClass::test_method bekerja paling baik untuk saya
StephenGodderidge
1
harus menandai ini sebagai anser yang diterima
Adam Hughes
13

Jika Anda memiliki nama metode yang sama di dua kelas yang berbeda dan Anda hanya ingin menjalankan salah satunya, ini berfungsi:

pytest tests.py -k 'TestClassName and test_method_name'
Peter
sumber
6

Metode 1 : Tes yang dipilih secara acak. Panjang dan jelek.

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

Metode 2: Gunakan Ekspresi Kata Kunci.

Catatan: Saya mencari dengan nama testcase. Hal yang sama berlaku untuk nama TestClass.

Kasus 1: Di bawah ini akan berjalan mana yang ditemukan. Karena kami telah menggunakan 'ATAU'.

python -m pytest -k 'test_password_valid or test_no_configuration'

Katakanlah kedua di atas benar, 2 tes akan dijalankan.

Kasus 2: Sekarang nama yang salah dan nama lain yang benar.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Hanya satu yang ditemukan dan dijalankan.

Kasus 3 : Jika Anda ingin semua tes berjalan atau tidak ada, gunakan DAN

python -m pytest -k 'test_password_valid and test_no_configuration'

Keduanya akan dijalankan jika benar atau tidak sama sekali.

Kasus 4: Jalankan uji hanya dalam satu folder:

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

Kasus 5: Jalankan tes dari hanya satu file.

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

Kasus 6: Jalankan semua tes kecuali kecocokan.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'
Arindam Roychowdhury
sumber
1

Menurut dokumen tentang Jalankan tes dengan id simpul

karena Anda memiliki semua id simpul di foo.txt, jalankan saja

pytest `cat foo.txt | tr '\n' ' '`

ini sama dengan perintah di bawah ini (dengan konten file dalam pertanyaan)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
接口 夏季
sumber
1

Jawaban saya menyediakan cara untuk menjalankan subset pengujian dalam berbagai skenario.

Jalankan semua tes dalam suatu proyek

pytest

Jalankan tes di Direktori Tunggal

Untuk menjalankan semua tes dari satu direktori, gunakan direktori sebagai parameter untuk pytest:

pytest tests/my-directory

Jalankan tes dalam File / Modul Tes Tunggal

Untuk menjalankan file yang penuh dengan tes, daftar file dengan jalur relatif sebagai parameter untuk pytest:

pytest tests/my-directory/test_demo.py

Jalankan Fungsi Uji Tunggal

Untuk menjalankan fungsi uji tunggal, tambahkan ::dan nama fungsi tes:

pytest -v tests/my-directory/test_demo.py::test_specific_function

-v digunakan sehingga Anda dapat melihat fungsi mana yang dijalankan.

Jalankan Kelas Tes Tunggal

Untuk menjalankan kelas saja, lakukan seperti yang kami lakukan dengan fungsi dan tambahkan ::, lalu nama kelas ke parameter file:

pytest -v tests/my-directory/test_demo.py::TestClassName

Jalankan Metode Tes Tunggal Kelas Tes

Jika Anda tidak ingin menjalankan semua kelas tes, cukup satu metode, cukup tambahkan yang lain ::dan nama metode:

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

Jalankan Set Tes Berdasarkan Nama Uji

The -kpilihan memungkinkan Anda untuk lulus dalam sebuah ekspresi untuk menjalankan tes yang memiliki nama tertentu yang ditentukan oleh ekspresi sebagai substring dari nama tes. Dimungkinkan untuk menggunakan dan , atau , dan tidak membuat ekspresi yang kompleks.

Misalnya, untuk menjalankan semua fungsi yang memiliki _raises dalam namanya:

pytest -v -k _raises
lmiguelvargasf
sumber
0

Mungkin dengan menggunakan pytest_collect_file()pengait, Anda dapat menguraikan konten .txto.yaml file di mana tes yang menentukan seperti yang Anda inginkan, dan mengembalikan mereka ke inti pytest.

Contoh yang bagus ditunjukkan dalam dokumentasi pytest . Saya pikir apa yang Anda cari.

asterio gonzalez
sumber
0

Berikut adalah sebagian jawaban yang mungkin, karena hanya memungkinkan pemilihan skrip tes, bukan tes individual dalam skrip tersebut.

Dan itu juga dibatasi oleh saya menggunakan mode kompatibilitas warisan vs unittestskrip, jadi tidak menjamin itu akan bekerja dengan pytest asli.

Ini dia:

  1. buat dikte baru, katakanlah subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. hati-hati dengan impor yang secara implisit menganggap file berada di test_directory. Saya harus memperbaiki beberapa dari mereka dengan menjalankan python foo.py, dari dalam subset_tests_directorydan mengoreksi sesuai kebutuhan.

  5. Setelah tes script mengeksekusi dengan benar, hanya cd subset_tests_directorydan pytestdi sana. Pytest hanya akan mengambil skrip yang dilihatnya.

Kemungkinan lain adalah symlinking dalam direktori pengujian Anda saat ini, katakan seperti ln -s foo.py subset_foo.pyitu pytest subset*.py. Itu akan menghindari keharusan untuk menyesuaikan impor Anda, tetapi itu akan mengacaukan semuanya sampai Anda menghapus symlink. Bekerja untuk saya juga.

JL Peyret
sumber