2

背景: 我用 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(*... 并且测试开发人员必须记住它。更不用说它看起来很湿...(不是 DRY)。

4

1 回答 1

2

是的!如果您可以访问 Squish 6,则有一些新功能可以做到这一点。fixateResultContext() 函数将导致重写所有结果,以使它们看起来起源于祖先帧。请参阅文档

如果您使用的是 python,则可以将其包装到一个方便的上下文管理器中

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()

于 2016-03-08T13:39:18.733 回答