单元测试python中的软断言

时间:2013-09-12 00:38:31

标签: python unit-testing selenium assert

目前我有一个测试用例循环遍历词典词典,每个词典都包含一个我想在网页上测试的单独值(我使用的是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

3 个答案:

答案 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

我还没有亲自使用过它们,但是查看示例,看起来它们以基本相同的方式解决了相同的问题。