Bagaimana cara menjalankan tes tunggal dengan Nose in Pylons


152

Saya memiliki aplikasi Pylons 1.0 dengan banyak tes di direktori test / fungsional. Saya mendapatkan hasil tes yang aneh dan saya hanya ingin menjalankan satu tes. Dokumentasi hidung mengatakan saya harus bisa lulus dalam nama tes di baris perintah tapi saya mendapatkan ImportErrors tidak peduli apa yang saya lakukan

Sebagai contoh:

nosetests -x -s sometestname

Memberi:

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

Saya mendapatkan kesalahan yang sama untuk

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

Apa sintaks yang benar?

Jawaban:


233

nosetests appname.tests.functional.test_controllerharus bekerja, di mana file tersebut dinamai test_controller.py.

Untuk menjalankan kelas dan metode pengujian tertentu gunakan jalur formulir module.path:ClassNameInFile.method_name, yaitu, dengan titik dua yang memisahkan jalur modul / file dan objek di dalam file. module.pathadalah jalur relatif ke file (misalnya tests/my_tests.py:ClassNameInFile.method_name).


1
Ahhh, satu kombinasi yang tidak aku coba. desah . Terima kasih!
Ben

2
Itu akan menjalankan setiap tes dalam pengontrol / modul uji. Bagaimana dengan menjalankan metode uji tunggal? Sesuatu seperti appname.tests.functional.test_controller.name_of_test_method.
ryonlife

69
Untuk menjalankan kelas dan metode pengujian tertentu gunakan jalur formulir module.path:ClassNameInFile.method_name, yaitu, dengan titik dua yang memisahkan jalur modul / file dan objek di dalam file.
James Murty

9
Untuk orang lain yang bingung: module.pathadalah jalur relatif ke file (mis. my_tests.py:ClassNameInFile.method_name), Bukan jalur yang akan Anda gunakan dalam importpernyataan
bcoughlan

1
@bcoughlan saya menambahkan ini ke jawabannya! Ini sangat membingungkan.
schlamar

47

Bagi saya yang menggunakan Nosetests 1.3.0, varian ini berfungsi (tapi pastikan Anda ada __init__.pydi folder tes Anda):

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

Perhatikan bahwa titik dua tunggal antara nama modul dan nama kelas.


1
Terima kasih atas opsi kedua, dengan bantuan bash autocomplete, pasti yang paling nyaman.
Peter Kilczuk

Perlu dicatat bahwa untuk memanggil tes parameter (yang menggunakan @ parameterized.expand) Anda harus menggunakan sintaks ini: test_file.py:ClassNameInFile.MethodName_TestNumber, di mana TestNumber bisa 1, 2, 3, ... satu per uji parametrized
luca

2

Saya harus menambahkan ekstensi file ".py", yaitu,

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

Mungkin ini karena saya tidak memiliki kelas dalam file. Tanpa itu .py, hidungnya mengeluh:

Tidak dapat menemukan test_func_xy yang dapat dipanggil dalam file / path_to / my_file: file bukan modul python

Dan ini meskipun saya punya __init__.pydi folder /path_to/.


0

Saya menulis skrip kecil ini, berdasarkan jawaban sebelumnya:

#!/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

Berikut ini bekerja dengan baik untuk saya:

nosetests test_file.py:method_name

Perhatikan bahwa tes saya di mana tidak di kelas. Metode pengujian dalam satu file.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.