gpt4 book ai didi

python - 我应该在每个测试中断言相同的值吗?

转载 作者:行者123 更新时间:2023-11-28 21:19:14 24 4
gpt4 key购买 nike

我有一个简单的类,其中包含我要测试的公共(public) build 方法。目前我断言它在每次测试中返回的所有值。这是一种好的做法,还是我应该为静态值编写一个测试,而在其他测试中只检查根据输入而变化的值?

实现

class FiltersAttachment:
TYPE_OPTIONS = [
{"text": "All types", "value": "all"},
{"text": ":link: Webpages", "value": "web_pages"}
]

STATUS_OPTIONS = [
{"text": "Available / Unavailable", "value": "all"},
{"text": ":white_circle: Available", "value": "available"},
{"text": ":red_circle: Unavailable", "value": "unavailable"}
]

@classmethod
def _filter_options(cls, options, selected):
return list(filter(lambda t: t['value'] == selected, options))

@classmethod
def build(cls, check_type='', status=''):
return {
'fallback': 'Filters',
'callback_id': 'resource_filters',
'color': '#d2dde1',
'mrkdwn_in': ['text'],
'actions': [
{
'name': 'resource_type',
'text': 'Type',
'type': 'select',
'options': cls.TYPE_OPTIONS,
'selected_options': cls._filter_options(
cls.TYPE_OPTIONS, check_type)
},
{

'name': 'resource_status',
'text': 'Status',
'type': 'select',
'options': cls.STATUS_OPTIONS,
'selected_options': cls._filter_options(
cls.STATUS_OPTIONS, status)
}
]
}

测试

class TestFiltersAttachment(TestCase):
def assert_attachment(self, attachment):
self.assertEqual(attachment['fallback'], 'Filters')
self.assertEqual(attachment['callback_id'], 'resource_filters')
self.assertEqual(attachment['color'], '#d2dde1')
self.assertEqual(attachment['mrkdwn_in'], ['text'])

type_action = attachment['actions'][0]
self.assertEqual(type_action['name'], 'resource_type')
self.assertEqual(type_action['text'], 'Type')
self.assertEqual(type_action['type'], 'select')
self.assertEqual(type_action['options'][0]['text'], 'All types')
self.assertEqual(type_action['options'][0]['value'], 'all')
self.assertEqual(type_action['options'][1]['text'], ':link: Webpages')
self.assertEqual(type_action['options'][1]['value'], 'web_pages')

status_action = attachment['actions'][1]
self.assertEqual(status_action['name'], 'resource_status')
self.assertEqual(status_action['text'], 'Status')
self.assertEqual(status_action['type'], 'select')
self.assertEqual(status_action['options'][0]['text'], 'Available / Unavailable')
self.assertEqual(status_action['options'][0]['value'], 'all')
self.assertEqual(status_action['options'][1]['text'], ':white_circle: Available')
self.assertEqual(status_action['options'][1]['value'], 'available')
self.assertEqual(status_action['options'][2]['text'], ':red_circle: Unavailable')
self.assertEqual(status_action['options'][2]['value'], 'unavailable')

def test_all_type_selected(self):
attachment = FiltersAttachment.build(check_type='all')
self.assert_attachment(attachment)

selected_type = attachment['actions'][0]['selected_options'][0]
self.assertEqual(selected_type['text'], 'All types')
self.assertEqual(selected_type['value'], 'all')

def test_all_status_selected(self):
attachment = FiltersAttachment.build(status='all')
self.assert_attachment(attachment)

selected_status = attachment['actions'][1]['selected_options'][0]
self.assertEqual(selected_status['text'], 'Available / Unavailable')
self.assertEqual(selected_status['value'], 'all')
...

最佳答案

测试套件质量的标准之一是,测试套件在测试失败的情况下如何支持您识别问题。理想情况下,您应该能够通过查看哪些测试失败和哪些没有失败来单独识别问题。您不需要使用调试器来找出实际出错的地方。

您编写测试的方式不会给您最好的支持。您在一个测试函数中打包了许多断言。因此,测试功能会因多种原因而失败,当您看到其中一个功能失败时,您将不得不进行详分割析或使用调试来找出失败的原因。当让你的测试冗余地检查方面时(正如你在问题中所问的那样),你会使它们更加不具体,这会使问题变得更糟。

因此,每个测试都应该检查一个特定的方面,这样一个测试的失败给出了最具体的信息。这是通过结合以下两个原则来实现的:

  • 每个测试都应验证一个特定方面。
  • 同一方面不应该有多余的测试。

在所谓的参数化测试的帮助下,可以方便地将每个断言转化为自己的测试。可以在以下问题中找到有关 Python 的一些提示:How do you generate dynamic (parameterized) unit tests in python?

关于python - 我应该在每个测试中断言相同的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com