Почему мои тесты носа повторяют тесты в форме A, AB, AB C при использовании наследования - PullRequest
0 голосов
/ 19 февраля 2020

Итак, у меня были проблемы с моим проектом по тестированию носа, поэтому я выделил проблему и попытался ее выяснить, но у меня осталось какое-то странное поведение. См. Мой скрипт ниже для справки.

from unittest import TestCase

class BaseClass(TestCase):

    @classmethod
    def setup_class(cls):
        print("defining base class stuff")

    def assert_something(self, expected, actual):
        assert expected == actual, "failed test"


class FirstClass(BaseClass):

    @classmethod
    def setup_class(cls):
        super(FirstClass, cls).setup_class()
        print("defining first class stuff")


    def test_first_class(self):
        self.assert_something(1, 1)


class SecondClass(FirstClass):

    @classmethod
    def setup_class(cls):
        super(SecondClass, cls).setup_class()
        print("defining second class stuff")


    def test_second_class(self):
        self.assert_something(5, 4)


class ThirdClass(SecondClass):

    @classmethod
    def setup_class(cls):
        SecondClass.setup_class()
        print("defining third class stuff")


    def test_third_class(self):
        self.assert_something(13, 13)

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

(sandbox_venv) michael@Puter:~/workspace/sandbox$ nosetests -v
test_first_class (test_.FirstClass) ... ok
test_first_class (test_.SecondClass) ... ok
test_second_class (test_.SecondClass) ... FAIL
test_first_class (test_.TestThirdClass) ... ok
test_second_class (test_.TestThirdClass) ... FAIL
test_third_class (test_.TestThirdClass) ... ok

из-за способа, которым я наследую. Очевидно, что они также наследуют тестовые случаи и запускают их снова. Это то, что я имею в виду под «A, AB, AB C» в названии.

Это не требуемая функциональность. Я пытался сделать проект так, чтобы я мог выполнять свои тесты в определенном порядке c, но я также мог сделать каждый тест независимым друг от друга. Таким образом, если бы я запускал только тесты ThirdClass, он запускал бы setup_class () из каждого последующего класса, но не из тестов.

1 Ответ

0 голосов
/ 24 февраля 2020

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

Вместо этого я удалил наследование и вместо этого просто вызвал метод setup_class в base_class из каждого из методов установки классов , вот так:

from unittest import TestCase

class BaseClass(TestCase):

    @classmethod
    def setup_class(cls):
        print("defining base class stuff")

    @classmethod
    def assert_something(cls, expected, actual):
        assert expected == actual, "failed test"


class FirstClass():

    @classmethod
    def setup_class(cls):
        BaseClass.setup_class()
        print("defining first class stuff")


    def test_first_class(self):
        BaseClass.assert_something(1, 1)


class SecondClass():

    @classmethod
    def setup_class(cls):
        BaseClass.setup_class()
        print("defining second class stuff")


    def test_second_class(self):
        BaseClass.assert_something(5, 4)


class ThirdClass():

    @classmethod
    def setup_class(cls):
        BaseClass.setup_class()
        print("defining third class stuff")


    def test_third_class(self):
        BaseClass.assert_something(13, 13)
...