gpt4 book ai didi

Python单元测试: respond to failure within the test method

转载 作者:行者123 更新时间:2023-12-01 06:01:05 25 4
gpt4 key购买 nike

背景

我试图弄清楚如何针对多个输入值运行单个单元测试,然后显示失败。这是我所想到的一个简单的演示:

from time import time
import unittest

def demo():
while True:
count = 0
for i in xrange(10):
count += 1
yield int(time() * 1000) + count
count = 0

class TestDemo(unittest.TestCase):
def setUp(self):
self.gen = demo()
self.prev = next(self.gen)

def test_always_bigger(self):
for cycle in xrange(1000):
curr = next(self.gen)
self.assertGreater(curr, self.prev)
self.prev = curr

if __name__ == '__main__':
unittest.main()

我发现的最相似的问题已经得到了某种动态的回答 test_<something>方法创建(例如: 123 )或 nose generators (例如: 12 )。我希望基于不可预测的输入运行数千次迭代,同时坚持使用标准库,因此这两种解决方案都不适合。简单的循环(如上所示)可以很好地工作,但有两个限制:对于复杂的输入,没有足够的记录导致测试失败(我真正的问题);并且,test_<...> 内的单个故障方法整个测试失败。

问题

我可以忍受早期的失败,但如何才能获得导致失败的输入,而不在成功时创建数千行输出?

无应答

我尝试了 assert...方法msg kwarg 但它实际上只适用于图书馆已经处理得很好的那种琐碎情况。在上面的示例中,unittest 知道显示两个 long导致断言失败的原因。我可以用 self.assertGreater(curr, self.prev, msg="cycle %s"% Cycle) 对此进行注释并提供对失败的大量见解,但是在assertDictEquals 上显示深度嵌套的字典是一团糟。 p>

理想的解决方案

这个answer显示了日志记录模块的有趣用法,但每次成功的测试都会生成数千行输出。是否可以从测试方法中检测故障?像这样的东西:

    def test_always_bigger(self):
for cycle in xrange(1000):
curr = next(self.gen)
fail = self.assertGreater(curr, self.prev)
if fail:
log.debug('...')
self.prev = curr

最佳答案

def test_always_bigger(self):
for cycle in xrange(1000):
curr = next(self.gen)
try:
self.assertGreater(curr, self.prev)
except AssertionError: # raised by TestCase.fail, called by all asserts
log.debug('...')
raise
self.prev = curr

这实现了在失败时记录日志的语义,然后继续失败。如果您想完成所有测试,我会执行以下操作:

def test_always_bigger(self):
ex = None
for cycle in xrange(1000):
curr = next(self.gen)
try:
self.assertGreater(curr, self.prev)
except AssertionError, ae:
ex = ae # just remember it
log.debug('...')
self.prev = curr
if ex:
raise ex

显然,这只会引发第一个 AssertionError,但它会运行直到完成并独立记录所有失败。由于此函数仅代表框架的一项测试,因此您实际上无法从中产生多个失败。

如果您出于某种原因需要访问所有异常,您可能可以使用以下方法(未使用 unittest 进行彻底测试)

def test_always_bigger(self):
exes = []
for cycle in xrange(1000):
curr = next(self.gen)
try:
self.assertGreater(curr, self.prev)
except AssertionError, ae:
exes.append(ae)
log.debug('...')
self.prev = curr
if exes:
self.fail(exes)
# if that doesn't work, try: raise AssertionError(exes)

关于Python单元测试: respond to failure within the test method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10424836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com