2016-01-10 20 views
7

init() ed (belki de en iyi tasarım değil, yeniden yazma seçeneğidir) bağlı olarak tamamen farklı davranışı olan bir (python3) paketim var. Modül sadece bir kez init() olabilir, ikinci kez bir hata verir. Bu paketi (her iki davranış) py.test kullanarak test etmek istiyorum. Not: Paketin niteliği iki davranışı karşılıklı olarak münhasır kılar, hem tekil bir programda her ikisini de istemenin olası bir nedeni yoktur.python'u yeniden başlatma (veya yeniden modülleri) py.test testlerinde

Test dizinime serveral test_xxx.py modülüm var. Her bir modül paketi ihtiyaca göre (fikstür kullanarak) başlatacaktır. py.test, python yorumlayıcısını bir kez başlattığından, tüm test modülleri bir py.test çalışmasında çalıştırılamıyor. Paketin ikinci bir init() izin vermek için yamalamak, yapmak istediğim bir şey değil, çünkü açıklanamayan davranışlarla sonuçlanabilecek dahili önbellek vb.

  • mümkün (
  • güvenilir bir paket yeniden bir yol var (bu şekilde başka bir test-modülünde inits etkisinde olan) bir ayrı piton işlemde, her bir test modülü çalıştırmak için py.test söylemek mi tüm alt bağımlılıklar, vb. dahil)?
  • Başka bir çözüm var mı (paketi bir fikstürde içe aktarmayı ve sonra da unimport'u düşünmeyi düşünüyorum, ama bu aşırı görünüyor)? , Çoklu işlemler kod bazen acı Ayrıca

    from imp import reload 
    import some_lib 
    #do something 
    reload(some_lib) 
    

    olan yeni süreçte her test başlatılması yaşayabilir, fakat:

+0

onunla hiçbir deneyime sahip ama birkaç subprocesses başlayıp bu şekilde şeyler yapmak/kullanmak bu eklentiyi adapte olabilir: https://pytest.org/latest/xdist. html # running-tests-in-a-python-subprocess –

+0

Tek bir dosyada pytest çalıştırmak mümkün ise ('pytext text/text_xyz.py), test_xyz dosyalarını bulmak ve her birinde çalıştırmak için bir program yazabilirsiniz. Alt işlem modülü ile ayrı işlem. Simeon tarafından başvurulan eklentinin yapması gereken şey budur. –

+0

Teşekkürler. Pytest-xdist'e bakıldığında maalesef modül başına yeni bir alt işlem başlatmıyor. Gerçekten de şu anda 2 dizindeki test modüllerine sahibim: biri diğerini kullanarak, bir diğerini kullanıyor. Sonra dizin başına bir kez pytest koşarım. Bununla birlikte, bireysel çalışmaların geri dönüş değerlerinin ve test raporlarının birleştirildiğinden emin olmak için fazladan bir komut dosyasına ihtiyacım var. – Claude

cevap

1

bir modül yeniden yüklemek için imp Örnek

kütüphanesinden reload() kullanmayı deneyin hata ayıklamak

Örnek

import some_test 
from multiprocessing import Manager, Process 

#create new return value holder, in this case a list 
manager = Manager() 
return_value = manager.list() 
#create new process 
process = Process(target=some_test.some_function, args=(arg, return_value)) 
#execute process 
process.start() 
#finish and return process 
process.join() 
#you can now use your return value as if it were a normal list, 
#as long as it was assigned in your subprocess 
+0

Python3 kullanıyorum, yani 'importlib' olmalıdır. Bir modülü bu şekilde yeniden yükleme (maalesef) bu modül için global sözlüğü temizlemez, bu yüzden yardımcı olmaz. Ayrıca korktuğum tüm bağımlı modülleri yeniden yüklemez.Her testin yeni bir süreçte yürütülmesi ilginç görünüyor ancak bunun 'py.test' ile nasıl birleştiğini göremiyorum. Ayrıca her bir fonksiyona değil, ayrı bir testte çalışmak için her * modül * 'e ihtiyacım var. – Claude

İlgili konular