Запустите один тест из основного модуля - PullRequest
2 голосов
/ 16 апреля 2020

Предположим, у меня есть myclass_test.py с Носом тестов со следующими строками:

import nose

class TestMyClass:
    def test_method(self):
        assert true

    def test_another_method(self):
        assert true

if __name__ == "__main__":
    nose.runmodule()

Так что я могу запустить python myclass_test.py и пройти все свои тесты. Все работает, как и ожидалось.

Что я должен передать runmodule () для запуска одного теста (например, test_method)?

Если это невозможно с Nose, возможно ли с какой-то другой структурой модульного тестирования таким же образом (с бегуном внутри модуля)?

PS На самом деле я запускаю не python myclass_test.py, а sage myclass_test.sage. Это интерпретатор SageMath и файл SageMath. Код SageMath - это, в основном, код Python, а myclass_test.sage, наконец, готовит к myclass_test.sage.py и запускается со встроенным интерпретатором Sage Python.

Так что он не распознается как модуль интерпретатором Python, поэтому передача чего-то вроде sage myclass_test.sage TestMyClass.test_method или sage myclass_test.sage myclass_test.sage:TestMyClass.test_method или sage myclass_test.sage myclass_test.sage.py:TestMyClass.test_method не работает (по той же причине, что один не может напрямую импортировать файл sage как модуль ). Даже при том, что Нос проходит argv на runmodule() автоматически.

PPS Также я не могу использовать внешний бегун, такой как nosetests -q -s sage myclass_test.sage:TestMyClass.test_method.

1 Ответ

1 голос
/ 17 апреля 2020

Я не использовал нос, но есть возможность сделать это с помощью unittest:

import unittest

class TestMyClass(unittest.TestCase):
    def test_method(self):
        assert True

    def test_another_method(self):
        assert True

if __name__ == '__main__':
    suite = unittest.TestSuite([TestMyClass('test_method')])
    unittest.TextTestRunner().run(suite)

И то же самое с pytest:

import pytest

class TestMyClass:
    def test_method(self):
        assert True

    def test_another_method(self):
        assert True

if __name__ == '__main__':
    pytest.main([f'{__file__}::TestMyClass::test_method'])

Хорошо, я также проверил с носом, и это, кажется, работает:

import nose
from nose.suite import ContextSuite

class TestMyClass:
    def test_method(self):
        assert True

    def test_another_method(self):
        assert True

if __name__ == '__main__':
    suite = ContextSuite([TestMyClass.test_method])
    nose.runmodule(suite=suite)

, хотя вывод странный - хотя он, безусловно, запускает тест, он говорит: «Выполнено тестов 0».

...