目前我有一个测试用例循环遍历词典词典,每个词典都包含一个我想在网页上测试的单独值(我使用的是Selenium Webdriver,虽然这不一定与问题相关) 。此测试用例基本上将检查产品的所有可能购买路径是否正常工作,这大约是200条不同的路径。我想保持代码简单,不要为每个代码进行测试。下面是我为缩短代码所做的一些示例:
self.templates = {"sales": self.sales", ...)
self.template_keys = ["sales",....]
self.sales - {"locator1": "<locataor info>, ...)
.... <more dictionaries>
for key in self.template_keys:
for template in self.templates[key]:
<do purchase path in selenium webdriver>
assert end_url == expected_end_url # Would like failure to not end test
我的问题是如何让嵌套for循环中的断言不致命地失败并继续下一步。我有read this stackoverflow article,他似乎决定做自己的事情而不提供他所做的任何信息。我知道这是一种反模式,但我不值得花时间分别编写所有这些模式。我想知道是否有人有一个好的解决方案,有效的like soft asserts in Groovy。
答案 0 :(得分:2)
收集多个失败的报告:
将assert
替换为if
,并为其中的每个故障创建描述符。
在列表中收集这些描述符(最初为空:failures = []
):
if end_url != expected_end_url:
failures.append(end_url + ' != ' + expected_end_url)
最后,assert
列表为空,如果不是,则将其用作错误消息:
assert(failures == [], str(failures))
比捕获异常更具可读性 - 而且非常灵活。
答案 1 :(得分:0)
为什么不抓住例外:
for key in self.template_keys:
for template in self.templates[key]:
<do purchase path in selenium webdriver>
try: assert end_url == expected_end_url # Would like failure to not end test
except AssertionError: // do something.
答案 2 :(得分:0)
今天,我对软断言的需求完全相同,这是我上一次使用Java和TestNG时偶尔使用的东西。令我有些惊讶的是pytest内置的东西。但是我发现有(至少)两个Python库。
第一个最柔和:https://pypi.org/project/softest/
第二个是Python延迟声明:https://github.com/pr4bh4sh/python-delayed-assert
我还没有亲自使用过它们,但是查看示例,看起来它们以基本相同的方式解决了相同的问题。