Нос не может найти тесты в Ubuntu - PullRequest
51 голосов
/ 22 сентября 2009

Есть ли причина, по которой Nose не сможет найти тесты в Ubuntu 9.04?

Я использую нос 0.11.1 с питоном 2.5.4.
Я могу запустить тесты, только если я явно укажу имя файла. Если я не укажу имя файла, оно просто говорит: 0 tests .

Тот же самый проект отлично запускает тесты на моем Mac, так что я довольно озадачен!

Ответы [ 7 ]

102 голосов
/ 16 октября 2009

Другая вещь, которую всегда дает мне с nose, это то, что он не будет запускать тесты в исполняемых файлах. Я не совсем уверен, почему это будет иметь значение для Mac / Ubuntu, но оно того стоит.

Убедитесь, что скрипты так или иначе не получили chmod +x на Mac ... И если они это сделали, исправьте их с помощью chmod -x $(find tests/ -name '*.py').

61 голосов
/ 22 сентября 2009

Такое поведение почти наверняка, потому что ваши файлы не названы в соответствии с поведением проверки соответствия носа. От носа документов :

Нос автоматически собирает тесты из исходных файлов, каталогов и пакетов python, находящихся в его рабочем каталоге (по умолчанию это текущий рабочий каталог). Любой исходный файл, каталог или пакет Python, соответствующий регулярному выражению testMatch (по умолчанию: (?: ^ | [B _.-]) [Tt] est), будет собран как тест (или источник для сборник тестов).

Акцент был мой.

Некоторые примеры имен, которые будут соответствовать:

  • TestFoo.py
  • Foo-Test.py
  • Foo_Test.py
  • Foo.Test.py (обратите внимание, что этот попытается импортировать Foo и вызовет исключение, если не сможет)

Имя, которое выглядит так, как оно соответствует, но на самом деле не соответствует:

  • FooTest.py

Если вы просто переименуете свои файлы, вам будет хорошо.


Обновление : Я не смог узнать по опубликованным вами деталям, но, возможно, в ваших тестовых каталогах отсутствуют файлы __init__.py?

... убедитесь, что ваши «тестовые» каталоги на самом деле являются модулями (в них есть пустой __init__.py файл).

39 голосов
/ 14 сентября 2011

У меня была такая же проблема. Мои тесты нормально выполнялись в Windows, но не в Ubuntu.

В Ubuntu, если вы запустите:

nosetests -vv --collect-only

Вы, вероятно, увидите, что он пропускает ваш тестовый файл, потому что это исполняемый файл: _Tools / LintControlFiles / test_HgLint.py является исполняемым; пропущено

Чтобы заставить нос рассматривать исполняемые файлы, запустите его так:

nosetests --exe
17 голосов
/ 13 апреля 2011

Я могу подтвердить, что, как сказал @ david-wolever, они не могут быть исполняемыми в Ubuntu. Run

nosetests -vv --collect-only 

чтобы увидеть полную информацию о том, какие файлы были проверены.

10 голосов
/ 18 сентября 2013

Что-то связанное, если вы запускаете тесты вне каталога, т.е.

nosetests ... tests/

где tests - это имя папки с моими тестами, в которой есть отдельные функции тестирования python в одном из модулей .py ... Ваши функции должны начинаться с 'test' для тестов на носу, чтобы распознать этот тест как нужный бежать.

например:

 def test_something():
    ...

Тесты носа будут запускать эту функцию при выполнении в этом каталоге, пока

 def somethin_to_test():
    ...

не будет.

2 голосов
/ 20 декабря 2017

Используйте -all-modules, и он найдет все тесты.

nosetests --all-modules ./tests

1 голос
/ 12 января 2017

После просмотра источника носа, в частности файла selector.py, если вы посмотрите, что происходит,

https://github.com/nose-devs/nose/blob/master/nose/selector.py#L129

При проверке, если мы вызываем wantFile, self.matches, который затем выполняет поиск regex против match, который вы бы передали как testMatch.

Проблема возникает, когда вы потом проверяете (и во всем этом файле),

https://github.com/nose-devs/nose/blob/master/nose/selector.py#L152

Он снова выполняет тот же тип проверок, против wantFunction.

Это означает, что если у вас есть другая структура для вашего пакета, вашего файла-контейнера и вашего фактического тестового класса / функции, вам придется создавать сумасшедшее сложное регулярное выражение, чтобы соответствовать этому на каждом этапе.

Для меня, когда я узнал об этом, я решил добавить к моему пакету, контейнеру и тестовым функциям общий бит, т. Е.

setests ├── __init__.py ├── setest_area1.py └──── def setest_someblock(): ...

И тогда моя nose команда работает как,

nose --testMatch="setest"

Это затем фильтрует то, как я ожидаю, что оно будет работать.

...