![](/img/trans.png)
[英]Run tornado.testing.AsyncTestCase using asyncio event loop
[英]Can I have an abstract base class for my tornado.testing.AsyncTestCase tests?
是否有可能在龍卷風中定義測試的基類本身不作為測試運行?
假設我有以下最小示例作為基類:
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 定義它們自己的值......並進行一些它們自己的特定測試。 像這樣:
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)。 即使我只嘗試運行繼承測試,也會發生這種情況。
有什么辦法解決這個問題,還是我必須在每個測試用例中復制功能?
python3 -m tornado.testing ConcreteTestCase.ConcreteTestCase
#!/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就是一個很好的例子。
一種方法是使用多重繼承。 抽象類不需要擴展 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
友好的替代方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.