Могу ли я вкладывать TestCases в нос? - PullRequest
4 голосов
/ 07 января 2012

Я стал поклонником вложенных контекстов тестовых примеров в таких вещах, как RSpec и Jasmine, и мне интересно, есть ли какие-нибудь плагины Nose, которые реализуют тестовый искатель, который позволяет вам вкладывать классы в контекст.Результирующие тесты будут выглядеть примерно так:

from nose.tools import *
from mysystem import system_state

class TestMySystem (TestCase):
    def setUp(self):
        system_state.initialize()

    class WhenItIsSetTo1 (TestCase):
        def setUp(self):
            system_state.set_to(1)

        def test_system_should_be_1 (self):
            assert_equal(system_state.value(), 1)

    class WhenItIsSetTo2 (TestCase):
        def setUp(self):
            system_state.set_to(2)

        def test_system_should_be_2 (self):
            assert_equal(system_state.value(), 2)

В приведенном выше гипотетическом случае system_state.initialize() будет вызываться перед каждым тестом.Я знаю, что PyVows делает что-то подобное, и это выглядит неплохо, но я ищу что-то, что можно подключить к моему текущему проекту, в котором уже есть несколько тестов в стиле unittest / носа.

Ответы [ 2 ]

2 голосов
/ 18 декабря 2012

Похоже, вы хотите, чтобы некоторые тесты наследовали код настройки от других тестов:

from nose.tools import *
from mysystem import system_state

class TestMySystem (TestCase):
    def setUp(self):
        system_state.initialize()

class WhenItIsSetTo1 (TestMySystem):
    def setUp(self):
        super(WhenItIsSetTo1, self).setUp()
        system_state.set_to(1)

    def test_system_should_be_1 (self):
        assert_equal(system_state.value(), 1)

class WhenItIsSetTo2 (TestMySystem):
    def setUp(self):
        super(WhenItIsSetTo2, self).setUp()
        system_state.set_to(2)

    def test_system_should_be_2 (self):
        assert_equal(system_state.value(), 2)

Будьте осторожны, когда вы делаете это;если у вас есть реальные тестовые методы в родительском классе, они также будут выполняться при запуске дочернего элемента (конечно).Когда я делаю это, мне нравится создавать чистые родительские тестовые классы, которые предоставляют только setUp, tearDown & classSetup / classTearDown.

Это должно позволить вам произвольный уровень вложенности, хотя, как только вы это сделаете, вынужны юнит-тесты для юнит-тестов ...

0 голосов
/ 07 января 2012

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

Ваш пример станет:

def setup():
    system_state.initialize()

def teardown():
    system_state.teardown()

class WhenItIsSetTo1 (TestCase):
    def setUp(self):
        system_state.set_to(1)

    def test_system_should_be_1 (self):
        assert_equal(system_state.value(), 1)

class WhenItIsSetTo2 (TestCase):
    def setUp(self):
        system_state.set_to(2)

    def test_system_should_be_2 (self):
        assert_equal(system_state.value(), 2)
...