Нос2 против обнаружения теста носа (нос 2 не находит тесты)

Я только что начал проект python и пробую разные тестовые среды. У меня проблема в том, что Nose2 не находит мои тесты:

$ нос2 --подробный


Выполнено 0 тестов за 0,000 с

OK

в то время как носовые тесты находят их все

$ носовые тесты --только для сбора

.................................


Провел 33 теста за 0,004 с.

OK

В противном случае я могу выполнить один тест с помощью nose2 из того же каталога:

$ нос2 myproj.client.test.mypkg.mymodule_test

.


Выполнить 1 тест за 0,007 с

OK

где myproj.client.test.mypkg.mymodule_test выглядит так:

'''
Created on 18/04/2013

@author: julia
'''
from unittest import TestCase, main
import os
from myproj.client.mymodule import SUT
from mock import Mock
import tempfile

class SUTTest(TestCase):
    def setUp(self):
        self.folder = tempfile.mkdtemp(suffix='myproj')
        self.sut = SUT(self.folder, Mock())
        self.sut.init()

    def test_wsName(self):
        myfolder = os.path.join(self.folder, 'myfolder')
        os.mkdir(myfolder)
        self.sut.change_dir(myfolder)
        self.assertEquals(self.SUT.name, 'myfolder')

if __name__ == "__main__":
    main()

Я просматривал документацию и не могу найти возможную причину этого.

Запуск Python 2.7.3 на MacOs 10.8.3


person hithwen    schedule 23.04.2013    source источник
comment
Попробуйте запустить nose2 с опцией --verbose - вы должны понять, почему он пропускает ваши тесты.   -  person alecxe    schedule 24.04.2013
comment
тот же результат:/ (без подробностей)   -  person hithwen    schedule 24.04.2013
comment
Можете ли вы перечислить некоторые из ваших тестовых кодов?   -  person MichaelJCox    schedule 24.04.2013
comment
@MichaelJCox, хорошо, отредактировано   -  person hithwen    schedule 24.04.2013


Ответы (2)


В дополнение к ответу MichaelJCox еще одна проблема заключается в том, что по умолчанию Nose2 ищет имена ваших тестовых файлов, начинающиеся с «test». Другими словами, 'testFilePattern == test*.py' (вы можете найти это в nose2/session.py).

Вы можете исправить это двумя способами:

Укажите другой шаблон тестового файла в файле конфигурации:

Создайте файл конфигурации где-нибудь в вашем проекте (хорошее место — базовый каталог или там, где вы будете запускать Nose2). нос2 будет искать и загружать любой файл с именем nose2.cfg или unittest.cfg.

Добавьте это в этот файл конфигурации.

[unittest]
test-file-pattern=*.py

Теперь снова запустите Nose2, и он найдет эти старые тестовые случаи. Я не уверен, может ли это отрицательно повлиять на производительность Nose2 или что-то еще, но пока все хорошо для меня.

Переименуйте ваши тестовые файлы так, чтобы они начинались с test.

Например, если у вас есть такой проект:

/tests/
      __init__.py
      fluxcapacitor.py

Переименуйте /tests/fluxcapacitor.py в /tests/test_fluxcapacitor.py, теперь Nose2 снова найдет тесты внутри fluxcapacitor.py.

Более подробный вывод

Наконец, это не связано с вашим вопросом, но может быть полезно в будущем: если -verbose не выводит достаточно информации, вы также можете передать следующий дополнительный аргумент --log-level debug для еще большего вывода.

person bobc    schedule 14.05.2013

Похоже, что для того, чтобы найти тест, нам нужно 1 из 3 вещей:

  1. Ваши тесты должны быть в пакетах (просто создайте файлы __init__.py в каждом каталоге вашей тестовой структуры)
  2. Вам нужен каталог с именем «test» в том же каталоге, в котором запускается Nose2.
  3. Он должен быть в том же каталоге

Метод _discovery в Nose2 (в файле Nose2.plugins.loader.discovery.py) явно ищет каталоги с именем «test» или каталоги, которые являются пакетами (если он не просто берет ваши тестовые файлы из того же каталога):

            if ('test' in path.lower()
                or util.ispackage(entry_path)
                or path in self.session.libDirs):
                for test in self._find_tests(event, entry_path, top_level):
                    yield test

Если я настрою аналогичный тестовый файл (называемый test.py) и запущу Nose2 в том же каталоге, он вернет мне 1 тест OK.

Если я создам каталог с именем «тест», перемещу в него файл и запущу «нос2» из верхнего каталога, я получу сообщение об ошибке, в котором говорится, что он не может импортировать мой py-файл. Создание __init__.py в этом каталоге устраняет эту ошибку.

Если вместо этого я создам каталог «blah» и перемещу туда файл, я увижу проблему, которую вы указали выше:

Ran 0 tests in 0.000s

OK

Однако, если я затем создам __init__.py в каталоге 'blah', тест запустится, и я найду свой 1 тест и ОК.

person MichaelJCox    schedule 24.04.2013
comment
У меня есть файлы init .py во всех моих каталогах, но да, тестовые папки находятся не в каталоге верхнего уровня, а в каждом пакете. Однако, если я спущусь в myproj/client (который содержит тестовый пакет) и выполню там Nose2, я все равно получу 0 тестов, но все равно спасибо, я останусь с Nosetest - person hithwen; 25.04.2013
comment
init.py был решением для меня - person Or Arbel; 05.10.2013