Bir dosyadan hangi pytest testlerinin çalıştırılacağını belirtmenin bir yolu var mı?


190

pytestBir dosyadan çalıştırılacak testleri seçmenin bir yolu var mı ? Örneğin, foo.txtyürütülecek testlerin listesini içeren bir dosya :

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

Ya da test isminde ortak bir paterni olmayan birden fazla testi seçmenin bir yolu var mı?

pytest -k <pattern> tek bir desene izin verir.

Bir seçenek pytest.markher teste karşı bir teste sahip olmaktır , ancak benim gereksinimim farklı dosyalardan farklı test kombinasyonları çalıştırmaktır.

Her kalıp için birden çok kalıp ve bir test dosyası adı belirtmenin bir yolu var mı?

Veya

Bir dosyadaki tam test yollarını belirtmenin ve o dosyayı girdi olarak beslemenin bir yolu var mı pytest?

Veya

Bu amaç için kullanılabilecek bir kanca işlevi var mı?

Yanıtlar:


231

Test senaryolarını farklı desenlerle çalıştırmak için -kseçeneği kullanabilirsiniz :

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

Bu, test_001 ve test_some_other_test adlı test senaryolarını , test vakalarının geri kalanının seçimini kaldırır .

Not: Bu, test_001 veya test_some_other_test ile başlayan herhangi bir test durumunu seçer . Örneğin, test_0012 test senaryosunuz varsa, o da seçilecektir.


1
Teşekkürler. Ancak foo.py ve bar.py'de aynı adı taşıyan bir test varsa (test_001 deyin), her ikisinden de sonuçlandırılır.
Sharad

2
evet olacak, desen ile eşleşen herhangi bir şey ben notta belirtildiği gibi yürütülür
supamaze

Ama bu benim için bir problem. Hangi testlerin hangi dosyadan yürütüleceğini seçmek istiyorum.
Sharad

@NamGVU `-k <test yöntemi adı>`
supamaze

4
O olmalıpy.test path/to/test/file.py -k function_name_test
LittleZero

91

Testlerin belirlenmesi / testlerin seçilmesi

Pytest, komut satırından testleri çalıştırmak ve seçmek için birkaç yolu destekler.

Testleri bir modülde çalıştırma

pytest test_mod.py

Testleri bir dizinde çalıştırma

pytest testing/

Anahtar kelime ifadelerine göre testler yapın

pytest -k "MyClass and not method"

Bu, değişken dize ifadesiyle eşleşen adları içeren ve değişken olarak dosya adları, sınıf adları ve işlev adları kullanan Python işleçlerini içerebilen sınamaları çalıştırır. Yukarıdaki örnek çalışacak, TestMyClass.test_somethingancak çalışmayacakTestMyClass.test_method_simple .

Düğüm kimlikleriyle testleri çalıştırma

Toplanan her teste, nodeidmodül dosya adı ve ardından sınıf adları, işlev adları ve parametrelendirmeden parametreler gibi ayırıcılardan oluşan benzersiz bir kod atanır .:: karakterlerle .

Bir modül içinde belirli bir testi çalıştırmak için:

pytest test_mod.py::test_func

Komut satırında bir test yöntemi belirten başka bir örnek:

pytest test_mod.py::TestClass::test_method

Testleri marker ifadelerine göre yürütme

pytest -m slow

İle dekore edilmiş tüm testleri çalıştıracak @pytest.mark.slowDekoratör .

Daha fazla bilgi için işaretlere bakın .

Paketlerden test yapın

pytest --pyargs pkg.testing

Bu içe aktarılacak pkg.testing testleri bulmak ve çalıştırmak için dosya sistemi konumunu ve kullanacaktır.

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


test_mod.py::TestClass::test_method benim için en iyi çalıştı
StephenGodderidge

1
bunu kabul edilen yanıt işareti olarak işaretlemelidir
Adam Hughes

13

İki farklı sınıfta aynı yöntem adına sahipseniz ve bunlardan birini çalıştırmak istiyorsanız, bu işe yarar:

pytest tests.py -k 'TestClassName and test_method_name'

6

Yöntem 1 : Rastgele seçilen testler. Uzun ve çirkin.

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

Yöntem 2: Anahtar Kelime İfadeleri Kullanın.

Not: Testcase isimlerine göre arıyorum. Aynı şey TestClass adları için de geçerlidir.

Durum 1: Aşağıdakiler hangisi bulunursa çalışacaktır. 'VEYA' kullandığımızdan beri.

python -m pytest -k 'test_password_valid or test_no_configuration'

Yukarıdaki ikisinin gerçekten doğru olduğunu söyleyelim, 2 test yapılacak.

Durum 2: Şimdi yanlış bir ad ve başka bir doğru ad.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Sadece bir tane bulunur ve çalıştırılır.

Durum 3 : Tüm testlerin yapılmasını veya hiç kimsenin yapılmasını istemiyorsanız AND'i kullanın

python -m pytest -k 'test_password_valid and test_no_configuration'

Her ikisi de doğruysa veya hiç değilse çalıştırılır.

Durum 4: Testi yalnızca bir klasörde çalıştırın:

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

Durum 5: Testi yalnızca bir dosyadan çalıştırın.

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

Durum 6: Maç dışındaki tüm testleri yapın.

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

1

Düğüm kimlikleriyle çalıştırma testleri hakkındaki dokümana göre

foo.txt dosyasında tüm düğüm kimlikleri bulunduğundan,

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

bu aşağıdaki komutla aynıdır (sorudaki dosya içeriği ile)

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

1

Cevabım, bir test alt kümesini farklı senaryolarda çalıştırmak için bir yol sağlar.

Bir projedeki tüm testleri çalıştırma

pytest

Testleri Tek Bir Dizinde Çalıştırma

Tüm testleri tek bir dizinden çalıştırmak için dizini parametre olarak şu amaçlarla kullanın pytest:

pytest tests/my-directory

Testleri Tek Bir Test Dosyasında / Modülünde çalıştırın

Sınamalarla dolu bir dosyayı çalıştırmak için, göreli yolu içeren dosyayı aşağıdaki gibi bir parametre olarak listeleyin pytest:

pytest tests/my-directory/test_demo.py

Tek Test İşlevini Çalıştırma

Tek bir test işlevini çalıştırmak için şunu ekleyin ::ve test işlevinin adı:

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

-v hangi işlevin çalıştığını görebilmeniz için kullanılır.

Tek Test Sınıfı Çalıştırın

Yalnızca bir sınıfı çalıştırmak için, işlevlerle yaptığımız gibi ekleyin ::ve dosya parametresine sınıf adını ekleyin :

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

Test Sınıfının Tek Test Yöntemini Çalıştırma

Tüm bir test sınıfını, sadece bir yöntemi çalıştırmak istemiyorsanız, başka bir tane ::ve yöntem adı ekleyin :

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

Test Adına Göre Bir Test Seti Çalıştırın

Bu -kseçenek, ifade tarafından test adının alt dizesi olarak belirtilen belirli adlara sahip testleri çalıştırmak için bir ifadeyi iletmenizi sağlar. Kullanımı mümkündür ve , veya , ve değil karmaşık ifadeler oluşturun.

Örneğin, adlarında _ yükseltme bulunan tüm işlevleri çalıştırmak için:

pytest -v -k _raises

0

pytest_collect_file()Kanca kullanarak , testlerin istediğiniz gibi belirtildiği bir .txto .yamldosyasının içeriğini ayrıştırabilir ve bunları pytest çekirdeğine döndürebilirsiniz.

Güzel bir örnek pytest belgelerinde gösterilmektedir . Ne aradığını düşünüyorum.


0

İşte olası kısmi bir cevap, çünkü bu komut dosyalarındaki tek tek testlere değil, yalnızca test komut dosyalarının seçilmesine izin verir.

Ayrıca, eski uyumluluk modunu unittestkomut dosyalarına karşı kullanmamla da sınırlıydı , bu yüzden yerel pitest ile çalışacağını garanti etmemek.

İşte gidiyor:

  1. yeni bir dikte oluşturmak, demek subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. dolaylı olarak dosyaların içerdiğini varsayan ithalatlar konusunda dikkatli olun test_directory. Bunlardan birkaçını çalıştırarak python foo.py, içeriden subset_tests_directoryve gerektiği gibi düzelterek düzeltmem gerekiyordu.

  5. Test komut dosyaları doğru şekilde yürütüldükten sonra, orada cd subset_tests_directoryve pytestorada. Pytest yalnızca gördüğü komut dosyalarını alır.

Başka bir olasılık da geçerli test dizininizde symlinking, ln -s foo.py subset_foo.pyo zaman söyleyin pytest subset*.py. Bu, içe aktarma işlemlerinizi ayarlamanıza gerek kalmaz, ancak sembolik bağlantıları kaldırana kadar işleri karıştırır. Benim için de çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.