如何在Pylons中使用鼻子进行单个测试


152

我在test / functional目录中有一个带有一堆测试的Pylons 1.0应用程序。我得到的测试结果很奇怪,我只想运行一个测试。鼻子文档说我应该能够在命令行中传递测试名称,但是无论我做什么我都会得到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

正确的语法是什么?

Answers:


233

nosetests appname.tests.functional.test_controller应该工作,文件名为test_controller.py

要运行特定的测试类和方法,请使用形式为的路径module.path:ClassNameInFile.method_name,即用冒号分隔模块/文件路径和文件中的对象。module.path是文件的相对路径(例如tests/my_tests.py:ClassNameInFile.method_name)。


1
啊,我没有尝试过的一种组合。感叹。谢谢!

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 2012年

1
@bcoughlan我将此添加到了答案中!这真令人困惑。
schlamar

47

对我而言,使用Nosetests 1.3.0可以使用以下变体(但请确保您__init__.py在tests文件夹中):

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

请注意,模块名称和类名称之间应使用单个冒号。


1
感谢第二种选择,借助bash autocomplete绝对是最方便的选择。
Peter Kilczuk 2014年

值得注意的是,要调用参数化测试(使用@ parameterized.expand的测试),您必须使用以下语法:test_file.py:ClassNameInFile.MethodName_TestNumber,其中TestNumber可以是1,2,3,...每个参数化测试
luca

2

我必须添加“ .py”文件扩展名,即

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

也许是因为我在文件中没有任何类。没有.py,鼻子会抱怨:

在文件/ path_to / my_file中找不到可调用的test_func_xy:文件不是python模块

而且尽管我__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

请注意,我的测试不在类中。测试方法在一个文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.