背景: 我用 Python 编写 Squish GUI 测试。我尝试尽可能地将测试代码制作为 Pythonic 和 DRY,因此我将所有重复代码移动到单独的类/模块中。
问题定义: test.verify 或assert 语句告诉调试器在该语句所在的行停止,在大多数情况下,该模块包含单个测试步骤的详细信息。此行在手动运行时在 eclipse 中显示,并在 Jenkins 中自动测试输出。
要实际查看测试中失败的内容,最好在内部带有断言的过程的调用点处停止调试器。然后测试人员/GUI 开发人员可以发现 GUI 上的哪些操作导致问题以及检查了哪些内容。
示例:
test_abstract.py
class App():
def open_file(self, filename):
pass # example
def test_file_content(content):
# squish magic to get file content from textbox etc.
# ...
test.verify(content in textBoxText)
test_file_opening.py
def main():
app = App()
app.open_file('filename.txt')
app.test_file_content('lorem')
由于 test.verify() 调用测试失败,调试器将停止并定向到 test_abstract.py 文件。它实际上没有提及导致此测试失败的测试步骤。
有没有办法告诉调试器忽略测试失败的直接位置并使其显示调用测试的过程的位置。我正在寻找一种优雅的方法,不需要在通用测试文件本身中包含太多代码。
不是理想的有效解决方案: 目前我没有在抽象模块内部使用 test.verify 并在特定的测试用例代码中调用它。通用测试函数返回一个元组(test_result、test_descriptive_message_with error),该元组用 * 解压:
def test_file_content(content):
# test code
return (result, 'Test failed because...')
测试用例代码包含:
test.verify(*test_file_content('lorem'))
这工作得很好,但是每个测试用例代码都必须包含大量 test.verify(*... 并且测试开发人员必须记住它。更不用说它看起来很湿...(不是干)。
最佳答案
是的!如果您可以访问 Squish 6,则可以使用一些新功能来实现此目的。 fixateResultContext() 函数将导致所有结果被重写,使得它们看起来源自祖先框架。 See Documentation .
如果您使用的是 python,则可以将其包装到 handy context manager 中
def resultsReportedAtCallsite(ancestorLevel = 1):
class Ctx:
def __enter__(self):
test.fixateResultContext(ancestorLevel + 1)
def __exit__(self, exc_type, exc_value, traceback):
test.restoreResultContext()
return Ctx()
def libraryFunction():
with resultsReportedAtCallsite():
test.compare("Apples", "Oranges")
以后对 libraryFunction()
的任何失败调用都将指向包含 libraryFunction()
的代码行,而不是 test.compare()
内。
关于python - 如何确定 Python 调试器在哪里停止以及应该责怪哪一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31786696/