Могу ли я иметь абстрактный базовый класс для моих тестов tornado.testing.AsyncTestCase? - PullRequest
0 голосов
/ 22 января 2020

Возможно ли иметь базовые классы, определяющие тесты в торнадо, которые сами по себе не выполняются как тесты?

Допустим, у меня есть следующий минимальный пример в качестве базового класса:

from tornado.testing import AsyncTestCase, gen_test
from tornado.httpclient import HTTPRequest

class AbstractTestCase(AsyncTestCase):
    def set_parameters(self):
        #Set some parameter value here: self.uri = ...
        raise NotImplementedError

    @gen_test
    def test_common_functionality(self):
        req = HTTPRequest(self.uri, method = "GET")
        response = yield self.client.fetch(req, raise_error=False)
        self.assertEqual(200, response.code)

Теперь я хотел бы сделать несколько тестовых случаев, которые унаследованы от этого, определить свое собственное значение для self.uri ... и иметь несколько конкретных c собственных тестов. Например:

class ConcreteTestCase(AbstractTestCase):
    def set_parameters(self):
        self.uri = "www.stackoverflow.com"

    @gen_test
    def test_some_other_thing(self):
        self.assertEqual(2, 1+1)

Однако, когда я пытаюсь запустить это, AbstractTestCase также запускается сам по себе, выдавая ошибку (NotImplementedError). Это происходит, даже когда я только пытаюсь запустить наследующие тесты.

Есть ли способ обойти эту проблему, или мне нужно дублировать функциональность в каждом тестовом примере?

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Один из способов сделать это - множественное наследование. Абстрактный класс не должен расширять AsyncTestCase, пока этот класс находится в иерархии наследования во время выполнения.

class AbstractTestCase(object):
    def set_parameters(self):
        #Set some parameter value here: self.uri = ...
        raise NotImplementedError

    @gen_test
    def test_common_functionality(self):
        req = HTTPRequest(self.uri, method = "GET")
        response = yield self.client.fetch(req, raise_error=False)
        self.assertEqual(200, response.code)

class ConcreteTestCase(AbstractTestCase, AsyncTestCase):
    def set_parameters(self):
        self.uri = "www.stackoverflow.com"

    @gen_test
    def test_some_other_thing(self):
        self.assertEqual(2, 1+1)

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

0 голосов
/ 22 января 2020

CLI

python3 -m tornado.testing ConcreteTestCase.ConcreteTestCase

testmain.py

#!/usr/bin/env python3
import unittest
from tornado.testing import main


def all():
    cases = ['ConcreteTestCase.ConcreteTestCase']
    return unittest.defaultTestLoader.loadTestsFromNames(cases)

main()

test / runtests.py является хорошим примером.

...