python - 如何确定 Python 调试器在哪里停止以及应该责怪哪一行?

标签 python debugging jenkins squish

背景: 我用 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/

相关文章:

jenkins - 在运行时从 Jenkins 工作流脚本获取构建日志?

jenkins - 如何将 git 凭据添加到构建中,以便能够在 shell 代码中使用?

python - 用户定义的 __mul__ 方法不可交换

python - Django 模型中的嵌套字典

python - 如何交换一串十六进制字节中的相邻字节(有或没有正则表达式)

c# - Visual Studio Watch 窗口中的 "Non-Public members"节点是什么?

c - 反调试技术的强度

gcc - 调试选项 -g 如何更改二进制可执行文件?

java - 如何查看 Jenkins 中与哪些工作相关的信息

python - 命令提示符 : Set up for Python 2. 默认为 7