我正在为Alexa应用程序编写集成测试。
我们的应用程序使用控制器-请求-响应模式。控制器接收具有指定意图和会话变量的请求,将请求路由到使用会话变量执行某些计算的函数,并返回具有该计算结果的响应对象。
就test_for_smoke而言,我们从UnhandledIntentTestCase获得了正确的行为。但是,test_returning_reprompt_text从不触发,因为returns_reprompt_text永远不会被覆盖。
有人能解释一下如何在父类中覆盖它和/或如何将正确的意图名称传递到setUpClass中的request对象吗?
intent_base_case.py
import unittest
import mycity.intents.intent_constants as intent_constants
import mycity.mycity_controller as mcc
import mycity.mycity_request_data_model as req
import mycity.test.test_constants as test_constants
###############################################################################
# TestCase parent class for all intent TestCases, which are integration tests #
# to see if any changes in codebase have broken response-request model. #
# #
# NOTE: Assumes that address has already been set. #
###############################################################################
class IntentBaseCase(unittest.TestCase):
__test__ = False
intent_to_test = None
returns_reprompt_text = False
@classmethod
def setUpClass(cls):
cls.controller = mcc.MyCityController()
cls.request = req.MyCityRequestDataModel()
key = intent_constants.CURRENT_ADDRESS_KEY
cls.request._session_attributes[key] = "46 Everdean St"
cls.request.intent_name = cls.intent_to_test
cls.response = cls.controller.on_intent(cls.request)
@classmethod
def tearDownClass(cls):
cls.controller = None
cls.request = None
def test_for_smoke(self):
self.assertNotIn("Uh oh", self.response.output_speech)
self.assertNotIn("Error", self.response.output_speech)
def test_correct_intent_card_title(self):
self.assertEqual(self.intent_to_test, self.response.card_title)
@unittest.skipIf(not returns_reprompt_text,
"{} shouldn't return a reprompt text".format(intent_to_test))
def test_returning_reprompt_text(self):
self.assertIsNotNone(self.response.reprompt_text)
@unittest.skipIf(returns_reprompt_text,
"{} should return a reprompt text".format(intent_to_test))
def test_returning_no_reprompt_text(self):
self.assertIsNone(self.response.reprompt_text)test_unhandled_intent.py
import mycity.test.intent_base_case as base_case
########################################
# TestCase class for unhandled intents #
########################################
class UnhandledIntentTestCase(base_case.IntentBaseCase):
__test__ = True
intent_to_test = "UnhandledIntent"
returns_reprompt_text = True输出
======================================================================
FAIL: test_correct_intent_card_title (mycity.test.test_unhandled_intent.UnhandledIntentTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/wdrew/projects/alexa_311/my_city/mycity/mycity/test/intent_base_case.py", line 44, in test_correct_intent_card_title
self.assertEqual(self.intent_to_test, self.response.card_title)
AssertionError: 'UnhandledIntent' != 'Unhandled intent'
- UnhandledIntent
? ^
+ Unhandled intent
? ^^
======================================================================
FAIL: test_returning_no_reprompt_text (mycity.test.test_unhandled_intent.UnhandledIntentTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/wdrew/projects/alexa_311/my_city/mycity/mycity/test/intent_base_case.py", line 56, in test_returning_no_reprompt_text
self.assertIsNone(self.response.reprompt_text)
AssertionError: 'So, what can I help you with today?' is not None
----------------------------------------------------------------------发布于 2018-05-03 23:11:15
这是因为执行顺序。在解析IntentBaseCase类的过程中,SkipIf装饰器执行一次。它们不会为每个类或每个对测试函数的调用重新执行。
SkipIf的装饰器模式设计用于固定的全局变量,例如相关模块的版本、操作系统或某些其他外部资源,这些资源的可用性可以在全局上下文中计算或知道。
跳过测试也应该是出于外部原因,而不是内部原因,例如子类的需求。跳过仍然是一种失败的测试,报告中指出了这一点,所以您可以看到您的测试套件没有执行项目的整个功能范围。
你应该重新设计你的基类结构,这样函数只有在子类的情况下才能运行,并跳过使用skip来实现。我的建议是:
class IntentBaseCase(unittest.TestCase):
...
class RepromptBaseCase(IntentBaseCase):
def test_returning_reprompt_text(self):
self.assertIsNotNone(self.response.reprompt_text)
class NoRepromptBaseCase(IntentBaseCase):
def test_returning_no_reprompt_text(self):
self.assertIsNone(self.response.reprompt_text)您还应该考虑将响应部分移出setUp,并将其放入自己的test_函数中,并将这些test_returning函数更改为更简单的assertReprompt和assertNoReprompt函数。在setUp中设置测试是一个好主意,但在那里运行实际代码并不是一个好主意。
https://stackoverflow.com/questions/50090857
复制相似问题