【问题标题】:Soft Asserts in unittest pythonunittest python中的软断言
【发布时间】:2013-09-16 04:57:06
【问题描述】:

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

【问题讨论】:

  • 尝试使用assertEqual()
  • 这个想法是注册一个失败但继续前进,所以你也会看到其他失败,对吧?
  • 这会阻止断言在失败时停止测试吗?
  • assertEqual() 将无法通过测试

标签: python unit-testing selenium assert


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      为什么不直接捕获异常:

      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.
      

      【讨论】:

      • 这是最有道理的,我想知道是否还有其他人做了什么。我猜不是。
      猜你喜欢
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多