3

目前我有一个循环遍历字典字典的测试用例,每个字典都包含一个我想在网页上测试的单独值(我正在使用 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 循环中的断言不会致命地失败并继续下一步。我已经阅读了这篇 stackoverflow 文章,看起来他似乎决定做自己的事情,而没有提供任何关于他所做的事情的信息。我知道这是一种反模式,但不值得我花时间把它们都单独写出来。我想知道是否有人有一个好的解决方案,就像 Groovy 中的软断言一样

4

3 回答 3

5

收集多个故障的报告:将 替换为assertanif并为其正文中的每个故障创建一个描述符。将这些描述符收集到一个列表中(最初为空:)failures = []

if end_url != expected_end_url:
    failures.append(end_url + ' != ' + expected_end_url)

最后,assert列表为空,如果不是,则将其用作错误消息:

assert(failures == [], str(failures))

比捕获异常更具可读性——而且非常灵活。

于 2013-09-24T10:35:47.213 回答
3

今天,我对软断言也有同样的渴望,这是我在上一份工作中使用 Java 和 TestNG 时偶尔使用的东西。我有点惊讶 pytest 没有内置这样的功能。但我发现(至少)有两个 Python 库可以做到这一点。

第一个是最软的:https ://pypi.org/project/softest/

第二个是Python-Delayed-Assert:https ://github.com/pr4bh4sh/python-delayed-assert

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

于 2019-07-22T15:14:28.150 回答
2

为什么不直接捕获异常:

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.
于 2013-09-12T12:43:52.570 回答