ฉันจะรันการทดสอบเดี่ยวด้วย Nose ใน Pylons ได้อย่างไร


152

ฉันมีแอพ Pylons 1.0 ที่มีการทดสอบมากมายในไดเรกทอรี test / functional ฉันได้รับผลการทดสอบแปลก ๆ และฉันต้องการทดสอบเพียงครั้งเดียว เอกสารจมูกบอกว่าฉันควรจะสามารถส่งผ่านชื่อการทดสอบที่บรรทัดคำสั่ง แต่ฉันได้รับ ImportErrors ไม่ว่าฉันจะทำอะไร

ตัวอย่างเช่น:

nosetests -x -s sometestname

ให้:

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

ฉันได้รับข้อผิดพลาดเดียวกันสำหรับ

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

ไวยากรณ์ที่ถูกต้องคืออะไร?

คำตอบ:


233

nosetests appname.tests.functional.test_controllertest_controller.pyควรจะทำงานที่ไฟล์ชื่อ

ในการรันคลาสการทดสอบและเมธอดเฉพาะให้ใช้พา ธ ของแบบฟอร์มmodule.path:ClassNameInFile.method_nameนั่นคือโดยที่โคลอนจะแยกพา ธ โมดูล / ไฟล์และวัตถุภายในไฟล์ module.pathเป็นเส้นทางสัมพัทธ์กับไฟล์ (เช่นtests/my_tests.py:ClassNameInFile.method_name)


1
Ahhh ชุดค่าผสมหนึ่งที่ฉันไม่ได้ลอง ถอนหายใจ ขอบคุณ!
เบ็น

2
ที่จะเรียกใช้การทดสอบทุกครั้งในการทดสอบคอนโทรลเลอร์ / โมดูล สิ่งที่เกี่ยวกับการใช้วิธีการทดสอบเดียว? appname.tests.functional.test_controller.name_of_test_methodสิ่งที่ชอบ
ryonlife

69
ในการรันคลาสการทดสอบและเมธอดเฉพาะให้ใช้พา ธ ของแบบฟอร์มmodule.path:ClassNameInFile.method_nameนั่นคือโดยที่โคลอนจะแยกพา ธ โมดูล / ไฟล์และวัตถุภายในไฟล์
James Murty

9
สำหรับคนอื่นสับสน: module.pathเป็นเส้นทางสัมพัทธ์ไปยังไฟล์ (เช่นmy_tests.py:ClassNameInFile.method_name) ไม่ใช่เส้นทางที่คุณจะใช้ในimportคำสั่ง
bcoughlan

1
@bcoughlan ฉันได้เพิ่มสิ่งนี้ในคำตอบ! นี่มันช่างสับสนจริงๆ
schlamar

47

สำหรับฉันที่ใช้ Nosetests 1.3.0 ตัวแปรเหล่านี้ใช้งานได้ (แต่ต้องแน่ใจว่าคุณมี__init__.pyในโฟลเดอร์ทดสอบ):

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

โปรดทราบว่าโคลอนเดียวระหว่างชื่อโมดูลและชื่อคลาส


1
ขอบคุณสำหรับตัวเลือกที่สองด้วยความช่วยเหลือของการเติมข้อความอัตโนมัติทุบตีแน่นอนที่สะดวกที่สุด
Peter Kilczuk

มันจะคุ้มค่าทราบว่าสำหรับการเรียกการทดสอบ parameterized (คนที่ใช้ @ parameterized.expand) คุณจะต้องใช้ไวยากรณ์นี้: test_file.py:ClassNameInFile.MethodName_TestNumber โดยที่ TestNumber อาจเป็น 1, 2, 3, ... หนึ่งต่อ การทดสอบแบบพาราเมตริก
ลูก้า

2

ฉันต้องเพิ่มนามสกุล ".py" นั่นคือ

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

อาจเป็นเพราะฉันไม่มีคลาสใด ๆ ในไฟล์ หากไม่มี.pyจมูกก็บ่นว่า:

ไม่พบ call_func_xy ที่เรียกได้ในไฟล์ / path_to / my_file: ไฟล์ไม่ใช่โมดูลของหลาม

และนี้ถึงแม้ว่าฉันมีในโฟลเดอร์__init__.py/path_to/


0

ฉันเขียนบทเล็ก ๆ นี้โดยอิงจากคำตอบก่อนหน้า:

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

ต่อไปนี้ทำงานได้ดีสำหรับฉัน:

nosetests test_file.py:method_name

โปรดทราบว่าการทดสอบของฉันไม่ได้อยู่ในชั้นเรียน วิธีทดสอบอยู่ในไฟล์เดียว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.