下载文件的集成测试
Integration tests who download files
我正在开发一个 web 应用程序,它可以完成一些工作,将数据打包到一个文件中并返回给您该文件 (Content-Type: application/force-download
)。现在我正在实施一些集成测试,我在其中请求数据,网络应用程序将文件返回给我。当测试下载预期数据时,Web 应用程序行为正确。我阅读了 this,发现它非常鼓舞人心,但是当您构建要下载的文件时,该响应有效吗?
您可以采用多种方法。从最好到最差 (YMMV) 的顺序:
从语义上检查输出。 例如,在 JSON 的情况下,检查它是否可以被解析,以及预期的键和值是否存在。如果是图片,请检查它是否可以解析并具有正确的格式。
Pro:你只是在测试你真正关心的东西。测试失败可能指向特定问题。
缺点:需要更多工作。
逐字节直接比较文件。 "golden master" 方法。如果文件大于几行,或者它是一个二进制文件,我会把它放在磁盘上并让集成测试加载它。这也会让你 view/edit 它在外部程序中更容易。
优点:很容易看出预期的文件是什么样子。
缺点:在不相关的更改的情况下可能很脆弱。例如,JSON 对象中键的顺序应该无关紧要。更糟糕的是,如果您正在生成 PNG 图像,创建时间可能会嵌入到文件中,因此您的测试每次都会失败。
比较文件哈希。我认为这是最后的手段。
优点:您不需要在集成测试中存储整个文件,只有当它真的很大时才好。
缺点:测试失败说明不了什么。甚至集成测试中嵌入的散列也不会告诉您任何信息。这只是一个 "change detector" 测试。
我正在开发一个 web 应用程序,它可以完成一些工作,将数据打包到一个文件中并返回给您该文件 (Content-Type: application/force-download
)。现在我正在实施一些集成测试,我在其中请求数据,网络应用程序将文件返回给我。当测试下载预期数据时,Web 应用程序行为正确。我阅读了 this,发现它非常鼓舞人心,但是当您构建要下载的文件时,该响应有效吗?
您可以采用多种方法。从最好到最差 (YMMV) 的顺序:
从语义上检查输出。 例如,在 JSON 的情况下,检查它是否可以被解析,以及预期的键和值是否存在。如果是图片,请检查它是否可以解析并具有正确的格式。
Pro:你只是在测试你真正关心的东西。测试失败可能指向特定问题。
缺点:需要更多工作。
逐字节直接比较文件。 "golden master" 方法。如果文件大于几行,或者它是一个二进制文件,我会把它放在磁盘上并让集成测试加载它。这也会让你 view/edit 它在外部程序中更容易。
优点:很容易看出预期的文件是什么样子。
缺点:在不相关的更改的情况下可能很脆弱。例如,JSON 对象中键的顺序应该无关紧要。更糟糕的是,如果您正在生成 PNG 图像,创建时间可能会嵌入到文件中,因此您的测试每次都会失败。
比较文件哈希。我认为这是最后的手段。
优点:您不需要在集成测试中存储整个文件,只有当它真的很大时才好。
缺点:测试失败说明不了什么。甚至集成测试中嵌入的散列也不会告诉您任何信息。这只是一个 "change detector" 测试。