Pilonlarda Burun ile tek bir testi nasıl çalıştırabilirim


152

Ben test / fonksiyonel dizinde testler bir grup ile bir Pylons 1.0 uygulaması var. Tuhaf test sonuçları alıyorum ve sadece tek bir test yapmak istiyorum. Burun belgeleri, komut satırında bir test adı geçebilmem gerektiğini söylüyor, ancak ne yaparsam yapayım ImportErrors alıyorum

Örneğin:

nosetests -x -s sometestname

verir:

Traceback (most recent call last):
  File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/loader.py", line 371, in loadTestsFromName
   module = resolve_name(addr.module)
  File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/util.py", line 334, in resolve_name
   module = __import__('.'.join(parts_copy))
ImportError: No module named sometestname

İçin aynı hatayı alıyorum

nosetests -x -s appname.tests.functional.testcontroller

Doğru sözdizimi nedir?

Yanıtlar:


233

nosetests appname.tests.functional.test_controller çalışmalı, dosyanın adı test_controller.py .

Belirli bir sınama sınıfını ve yöntemini çalıştırmak için, formun yolunu module.path:ClassNameInFile.method_name, yani modül / dosya yolunu ve dosyadaki nesneleri ayıran iki nokta üst üste işaretini kullanın. module.pathdosyanın göreli yoludur (ör. tests/my_tests.py:ClassNameInFile.method_name).


1
Ahhh, denemediğim tek kombinasyon. iç çeker . Teşekkürler!
Ben

2
Bu, bir test denetleyicisindeki / modülündeki her testi çalıştıracaktır. Tek bir test yöntemi çalıştırmaya ne dersiniz? Gibi bir şey appname.tests.functional.test_controller.name_of_test_method.
ryonlife 21:11

69
Belirli bir sınama sınıfını ve yöntemini çalıştırmak için, formun yolunu module.path:ClassNameInFile.method_name, yani modül / dosya yolunu ve dosyadaki nesneleri ayıran iki nokta üst üste işaretini kullanın.
James Murty

9
module.pathmy_tests.py:ClassNameInFile.method_nameimport
Kafası

1
@bcoughlan Bunu cevaba ekledim! Bu gerçekten kafa karıştırıcıydı.
schlamar

47

Benim için Nosetests 1.3.0'ı kullandığımda bu varyantlar çalışıyor (ancak __init__.pytestler klasörünüzde olduğundan emin olun ):

nosetests [options] tests.ui_tests
nosetests [options] tests/ui_tests.py
nosetests [options] tests.ui_tests:TestUI.test_admin_page

Modül adı ile sınıf adı arasında tek bir kolon olduğunu unutmayın.


1
İkinci seçenek için teşekkürler, bash autocomplete yardımıyla kesinlikle en uygun olanı.
Peter Kilczuk

Parametreli testleri çağırmak için (@ Parametreli.expand kullananları) şu sözdizimini kullanmanız gerekir: test_dosyası.py:ClassNameInFile.MethodName_TestNumber, burada TestNumber 1, 2, 3, ... parametreli test
luca

2

".Py" dosya uzantısını eklemem gerekiyor, yani,

r'/path_to/my_file.py:' +  r'test_func_xy'

Belki de bunun sebebi dosyada hiç sınıf olmamasıdır. Olmadan .py, burun şikayet ediyordu:

/ Path_to / my_file dosyasında çağrılabilir test_func_xy bulunamıyor: dosya bir python modülü değil

Ve bu __init__.pyklasörde bir olmasına rağmen /path_to/.


0

Bu küçük senaryoyu önceki cevaplara dayanarak yazdım:

#!/usr/bin/env bash

# 
# Usage:
# 
#     ./noseTest <filename> <method_name>
# 
# e.g.:
# 
#     ./noseTest test/MainTest.py mergeAll
#     
# It is assumed that the file and the test class have the _same name_ 
# (e.g. the test class `MainTest` is defined in the file `MainTest.py`).
# If you don't follow this convention, this script won't work for you.
#

testFile="$1"
testMethod="$2"

testClass="$(basename "$testFile" .py)"

nosetests "$testFile:$testClass.test_$testMethod"

0

Aşağıdaki benim için iyi çalıştı:

nosetests test_file.py:method_name

Notlarım nerede bir sınıfta değil. Test yöntemleri tek bir dosyadaydı.

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.