Як вказати єдиний тест у файлі з ності?


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 , я просто спробував синтаксис, який ви використовували з носом на моїй машині, і він працював чудово.
Джефф Тратнер

Відповіді:


148

Ви повинні вказати його так: nosetests <file>:<Test_Case>.<test_method>або

nosetests test_web.py:TestWeb.test_checkout

Дивіться документи


6
Чому на земній бібліотеці використовується ':' замість '.' ;)
омікрон

2
Може бути полегшити розмежування між модулем і класом?
Кріс

@omikron, коли я вказав файл, у мене не було помилок імпорту
gabeio

2
Нічого страшного, класичні бібліотеки пітона, а не турбота про існуючі інтерфейси
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 обидва звичаї повинні працювати відповідно до nos.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 та methodFile.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.