2012-09-25 17 views
42

py.test kullanarak, farklı dizinde aynı adlı iki sınama, py.test'in başarısız olmasına neden olur. Neden? Tüm testleri yeniden adlandırmadan bunu nasıl değiştirebilirim? çoğaltmak içinpy.test - farklı dizinlerdeki sınamalar aynı çağrıda bulunulduğunda sınama hatasını sınama

yapın:

; cd /var/tmp/my_test_module 
; mkdir -p ook/test   
; mkdir -p eek/test 
; touch ook/test/test_proxy.py 
; touch eek/test/test_proxy.py 
; py.test 
============================= test session starts ============================== 
platform linux2 -- Python 2.7.3 -- pytest-2.2.4 
collected 0 items/1 errors 

==================================== ERRORS ==================================== 
___________________ ERROR collecting ook/test/test_proxy.py ____________________ 
import file mismatch: 
imported module 'test_proxy' has this __file__ attribute: 
    /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py 
which is not the same as the test file we want to collect: 
    /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py 
HINT: remove __pycache__/.pyc files and/or use a unique basename for your test file modules 
=========================== 1 error in 0.01 seconds ============================ 

cevap

30

bir __init__.py çatışma çözme yollarından biridir koymak. Burundan farklı olarak, mevcut pytest, test modüllerini aynı içe aktarma adına almak için test modüllerini boşaltmaya çalışmaz. Eskiden bu oto-unimporting yapmak için biraz sihir olduğunu düşünürdüm ve ithalat mekanizmasının yaptığı şeyden insanların beklentilerini bertaraf edebilir; Bazen insanlar bir test modülünün küresel durumuna güvenirler ve otomatik boşaltma ile onu kaybedersiniz (başka bir test modülünden gelen bir test modülü beklenmedik şeyler yapabilir). Ama belki de pratik bir sorun değil ve bu yüzden pytest benzer bir kesmek ekleyebilirsiniz ...

+2

__init__.py gerektiren bir anlam ifade ediyor. Bir test bir pakette değilse, o zaman temel olarak üst düzey bir modül (OP, test_proxy'de) ve sadece bir tane olmalıdır. Test modüllerini ilgili paketlere yerleştirerek (ook ve eek), testlerin doğru bir ismini verir. Ben statükonun en iyisi olduğunu söylüyorum. Bu soruna bir hata mesajı bağlantısının olması ya da dokümanlardaki konuyla ilgili çalışmanın gerekçesini ve tekniğini açıklayan bir şeyle ilgili bazı acıyı hafifletebilir. –

+20

Sadece pyCest docs özellikle test dizinlerinde '__init __. Py' komutunu kullanmamaya dair bir nottur: _ Test dizinlerinizde __init __. Py' dosyalarını kullanmaktan kaçının.Bu şekilde testleriniz mypkg'ın kurulu bir sürümüne karşı kolayca çalışabilir. Kurulu paketin testleri içerip içermediğinden bağımsız olarak "_. [Pytest.org - İyi Entegrasyon Uygulamaları] 'dan alınmıştır (http://pytest.org/latest/goodpractises.html#choosing-a-test-layout-import-rules). – famousgarkin

+1

Güncelleme: @ famousgarkin 'in yukarıdaki tavsiyesi ve yanıtı (https://stackoverflow.com/a/21942491/260303) artık dokümanlar içinde görünmüyor (en azından "kaçının" aranması alıntıyı getirmiyor yukarıda): https://docs.pytest.org/en/latest/goodpractices.html#tests-as-part-of-application-code. Aslında, bu bağlantıdaki örnekler test dizinlerinde '__init __. Py' gösterir, dolayısıyla kabul edilen cevap doğrudur. –

14

Bu, py.test'in gerçek bir özelliğidir. Sen pytest.org - Good Integration Practices - Choosing a test layout/import rules belirtilen bu davranışın nedenini bulabilirsiniz: test dizinleri

  • önlemek __init__.py dosyaları. Bu şekilde testleriniz, kurulu paketin testleri içerip içermediğinden bağımsız olarak mypkg'un yüklü bir sürümüne karşı kolayca çalıştırabilir. Bu gibi

py.test ile çalışmanın önerilen iş akışı verilmiştir: test, sonra pip install -e ile geliştirilmekte olan paketi yükleyin.

Bu nedenle, kendimi yapılandırma biçimindeki sözleşmede benzersiz test isimlerini seçiyorum. Aynı zamanda çeşitli test çıkışlarında belirsiz test isimleri almamanızı sağlar.

Test adlarını saklamanız ve yukarıda belirtilen işlevleri önemsememeniz gerekiyorsa, __init__.py'u eklemeye devam etmeniz gerekir.

+0

Kullanım durumunu alamıyorum: "Bu şekilde testleriniz mypkg'ın kurulu bir sürümüne karşı kolayca çalıştırılabilir". Testlerimi "mypkg" geliştirme sürümüne karşı çalıştırıyorum. Bu şekilde testler var. Bu "benzersiz basename" hata mesajını önlemek için '__init __. Py' dosyalarını yaratıyorum. – guettli

+1

Dokümanları değiştirmek için bir özellik isteği oluşturdum: https: // bitbucket.org/hpk42/pytest/issue/529/unique-basename-and -__ init__py-docs – guettli

+1

@guettli Kullanım paketi, paketinizi setup.py aracılığıyla kurulu olarak test etmek istediğinizde. Bu, kurulumdaki tüm gerekli dosyaları dahil ettiğinizden, paketlenmiş veriler gibi ve tüm bağımlılıkların doğru şekilde ele alındığından emin olmak için kullanılabilir. Hedef sistemin bir derleyiciye sahip olmadığı ortamlara yüklemek için de kullanılabilir ve kurulum için bir ikili yumurta veya tekerleği kullanacaksınız. –

İlgili konular