当前位置: 首页 > 面试题库 >

断言失败时继续执行Python的单元测试

万俟旭
2023-03-14
问题内容

编辑:切换到一个更好的示例,并阐明了为什么这是一个真正的问题。

我想用Python编写在断言失败时继续执行的单元测试,这样我就可以在一个测试中看到多个失败。例如:

class Car(object):
  def __init__(self, make, model):
    self.make = make
    self.model = make  # Copy and paste error: should be model.
    self.has_seats = True
    self.wheel_count = 3  # Typo: should be 4.

class CarTest(unittest.TestCase):
  def test_init(self):
    make = "Ford"
    model = "Model T"
    car = Car(make=make, model=model)
    self.assertEqual(car.make, make)
    self.assertEqual(car.model, model)  # Failure!
    self.assertTrue(car.has_seats)
    self.assertEqual(car.wheel_count, 4)  # Failure!

在这里,测试的目的是确保Car’s__init__正确设置其字段。我可以将其分解为四个方法(这通常是个好主意),但是在这种情况下,我认为将其保留为测试单个概念的单个方法(“对象已正确初始化”)更容易理解。

如果我们认为最好不要破坏该方法,那么我有一个新问题:我无法一次看到所有错误。当我修复model错误并重新运行测试时,wheel_count错误就会出现。当我第一次运行测试时,这将节省我看到两个错误的时间。

为了进行比较,Google的C
++单元测试框架区分了非致命EXPECT_*断言和致命ASSERT_*断言:

断言成对出现,测试相同的事物,但对当前函数有不同的影响。ASSERT_ 版本在失败时会产生致命错误,并中止当前功能。EXPECT_

版本会产生非致命故障,不会导致当前功能终止。通常首选EXPECT_
,因为它们允许在测试中报告多个故障。但是,如果在所声明的断言失败后继续执行没有意义,则应使用ASSERT_

有没有一种方法可以EXPECT_*在Python的行为unittest?如果不在中unittest,那么是否存在另一个支持此行为的Python单元测试框架?

顺便说一句,我很好奇非致命性断言可能会带来多少实际测试,因此我看了一些代码示例(于2014-08-19编辑,使用searchcode代替了Google
Code Search,RIP)。从第一页随机选择的10个结果中,所有包含的测试都在同一测试方法中做出了多个独立的断言。所有人将从非致命的断言中受益。


问题答案:

您可能想要做的是派生,unittest.TestCase因为这是断言失败时抛出的类。您将不得不重新架构您的架构TestCase,以免抛出错误(也许保留失败列表)。重新架构内容可能会导致其他必须解决的问题。例如,您可能最终需要进行派生TestSuite更改以支持对您所做的更改TestCase



 类似资料:
  • 问题内容: 我正在通过Java与Eclipse和TestNG框架一起使用Selenium RC。我有以下代码片段: 第一个断言失败,执行被停止。但我想继续进一步的代码片段。 问题答案: Selenium IDE使用验证执行软断言,这意味着即使检查失败,测试仍将继续,并且可以在测试结束时或在发生硬断言时报告失败。 使用TestNG,可以通过使用自定义测试侦听器来拥有这些软断言。我已经在博客上记录了如

  • 我在单元测试中使用groovy脚本。我有以下代码片段,我在单个测试脚本中使用多个断言。 第一个断言失败并停止执行。但我想继续进一步的代码片段。 与selenium中的软断言类似,我应该如何收集groovy中的所有失败异常。

  • 问题内容: 我已经使用Jfunc构建了现有框架,该框架提供了即使测试用例中的一个断言失败时也可以继续执行的功能。Jfunc使用junit 3.x框架。但是现在我们正在迁移到junit4,所以我不能再使用Jfunc,而已将其替换为junit 4.10 jar。 现在的问题是,因为我们在框架中广泛使用了jfunc,并且使用junit 4,我们希望使我们的代码即使在测试用例中一个断言失败时也可以继续执行

  • 我使用Jfunc构建了我现有的框架,它提供了一个即使测试用例中的一个断言失败也能继续执行的工具。Jfunc使用junit3. x框架。但是现在我们正在迁移到Junit4,所以我不能再使用Jfunc,而是用junit4.10 jar代替了它。 现在的问题是,因为我们已经在我们的框架中广泛使用了jfunc,并且使用junit4,我们希望让我们的代码继续执行,即使其中一个断言在测试用例中失败。 有人对此

  • 我按照cypress在他们的文档中推荐的方式编写测试,即每个测试有多个断言,但是用这种方式编写测试时会出现一个问题,那就是如果断言失败,测试执行就会停止。 我希望每个测试有多个断言,如果其中一个失败,测试将失败,但将继续测试执行,所以在最后,我将能够看到测试中失败的所有断言,而不仅仅是第一个失败的断言。 提前感谢!