Как указать один тест в файле с тестами на нос?

102

У меня есть файл под названием test_web.py, содержащий класс TestWeb и множество методов с именем test_something ().

Я могу запустить каждый тест в классе так:

$ nosetests test_web.py 
...
======================================================================
FAIL: checkout test
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/me/path/here/test_web.py", line 187, in test_checkout
...

Но я не могу проводить отдельные тесты. Они дают мне ошибку «Нет такого теста» при запуске в том же PWD:

$ nosetests test_web.py:test_checkout
$ nosetests TestWeb:test_checkout

Что здесь могло быть не так?

опстастический
источник
не могу вам помочь, если вы не можете опубликовать свои тестовые примеры или SSCCE , я просто попробовал синтаксис, который вы использовали с носом на моей машине, и он работал нормально.
Джефф Тратнер 02

Ответы:

148

Вы должны указать это так:, nosetests <file>:<Test_Case>.<test_method>или

nosetests test_web.py:TestWeb.test_checkout

См. Документацию

Будет
источник
6
Почему библиотека использует ":" вместо "."? ;)
omikron
2
Может быть, чтобы упростить разграничение между модулем и классом?
Крис
@omikron, когда я указал файл, у меня не было ошибок импорта
gabeio
2
Вау, это ужасные классические библиотеки Python, не заботящиеся о существующих интерфейсах
Dagrooms,
16

Вы также можете указать модуль:

nosetests tests.test_integration:IntegrationTests.test_user_search_returns_users
Майкл Джозеф
источник
1
Я не знаю, это другая версия Python nosetestsили что-то еще, но этот синтаксис не работает. Что действительно работает, так это:, что nosetests tests/test_integration:IntegrationTests.test_user_search_returns_usersозначает - справочные файлы как файлы, а не модули Python, с использованием, /а не.
dwanderson
1
@dwanderson, оба использования должны работать, в соответствии с носом .readthedocs.io / en / latest / usage.html#selecting-tests . Ваш сбой может быть вызван тем, что testsне является модулем в вашей настройке?
michaeljoseph
1
Ах, верно, я забыл __init__.pyв testsкаталоге. Отлично сработано! Спасибо
dwanderson
11

Указание имен в командной строке, как предполагают другие ответы, работает и полезно. Однако, когда я пишу тесты, я часто обнаруживаю, что хочу запустить только тот тест, над которым я работаю, и имена, которые мне придется писать в командной строке, становятся довольно длинными и громоздкими для написания. . В таком случае я предпочитаю использовать собственный декоратор и флаг.

Я определяю wipd(«декоратор незавершенного производства») так:

from nose.plugins.attrib import attr
def wipd(f):
    return attr('wip')(f)

Это определяет декоратор, @wipdкоторый будет устанавливать wipатрибут на объекты, которые он украшает. Например:

import unittest
class Test(unittest.TestCase):

    @wipd
    def test_something(self):
        pass

Затем -a wipможно использовать в командной строке, чтобы сузить выполнение теста до тех, которые отмечены значком @wipd.

Обратите внимание на имена ...

Я использую имя @wipdдекоратора, @wipчтобы избежать проблем такого рода:

import unittest
class Test(unittest.TestCase):

    from mymodule import wip    
    @wip
    def test_something(self):
        pass

    def test_something_else(self):
        pass

importСделает wipдекоратор членом класса , и все тесты в классе будут выбраны. В attribпроверяют вставные родительский класс методы испытания , чтобы увидеть , если атрибут выбран , существует также и атрибуты, которые создаются и испытанные attribне существуют в отделенном пространстве. Итак, если вы тестируете, -a fooа ваш класс содержит foo = "platypus", тогда все тесты в классе будут выбраны плагином.

Луи
источник
3

Чтобы запустить несколько конкретных тестов, вы можете просто добавить их в командную строку, разделив их пробелом.

nosetests test_web.py:TestWeb.test_checkout test_web.py:TestWeb.test_another_checkout
Скурпи
источник
0

В моих тестах указание тестов с именами модулей не работает

Вы должны указать фактический путь к .py:

nosetests /path/to/test/file.py:test_function

Это с nose==1.3.7

Стивен
источник
0

Моим требованием было запустить один тест в тестовом файле, который находился в другом каталоге Windows - это было сделано из командной строки anaconda следующим образом:

провела тесты от:

(base) C:\Users\ABC\Documents\work\

но test_MyTestFile.py и methodsFile.py были в:

 (base) C:\Users\ABC\Documents\work\daily\

запустить единый тест, включая путь с кавычками следующим образом :

(base) C:\Users\ABC\Documents\work>nosetests "daily\\test_MyTestFile.py:MyTestClass.test_add_integers"

test_MyTestFile.py выглядел так:

import methodsFile
import unittest

class MyTestClass(unittest.TestCase):

    def test_add_integers(self):
        assert methodsFile.add(5, 3) == 8

    def test_add_integers_zero(self):
        assert methodsFile.add(3, 0) == 3

methodFile.py выглядел так:

def add(num1, num2):
        return num1 + num2
Грант Шеннон
источник