首页 > 解决方案 > 在 python 脚本中调用的 shell 命令的单元测试

问题描述

我正在为一个函数编写单元测试(使用 Python 3.7、Pytest 3.6 和 tox 3.0),该函数将一系列 shell 命令编译为字符串列表,然后使用subprocess模块执行它们。shell 命令执行以下操作:

我现在的测试是模拟 subprocess 模块,然后断言它是用一个字符串列表调用的,其中包含给定一些测试参数的所有预期命令。

有没有办法测试命令是否按预期执行?现在我的测试只是检查我提供给子进程模块的命令列表是否与我断言的命令列表相同。这并不能告诉我这些命令是否适合我想要实现的目标。相反,它仅用作测试我是否可以在两个不同的源文件中写下相同的字符串。

我可以模拟我期望 shell 命令具有的副作用吗?

标签: python-3.xshellunit-testingzsh

解决方案


您的问题结合了两个有趣的主题:a)测试从代码生成器生成的代码和 b)测试 shell 代码。

为了测试来自生成器的代码,您原则上必须执行以下操作:i)测试生成器是否创建了预期的代码 - 您已经完成了,ii)测试生成器实际粘合在一起的代码片段/片段行为(独立和组合)按预期行事(在您的情况下,shell 代码段最终将共同形成一个有效的 shell 程序) - 这是关于测试 shell 代码的部分,将在下面讨论,并且 iii ) 测试控制发电机的输入是否正确。

它可与编译器相媲美:i) 是编译器代码,ii) 是编译器组合以获取生成的汇编程序的汇编代码片段,以及 iii) 是提供给编译器以对其进行编译的源代码。一旦 i)、ii) 和 iii) 被测试,很少需要同时测试汇编代码(即在汇编代码级别)。特别是,源代码 iii) 理想地由测试框架以相同的编程语言进行测试。

但是,在您的情况下,第 iii) 部分的外观以及如何对其进行测试尚不清楚。

关于外壳代码/外壳代码片段的测试:外壳代码以与其他可执行文件或操作系统的交互为主。存在于 shell 代码交互中的问题类型是这样的要等。要测试所有这些,您不应该应用单元测试,而是应用集成测试。

在您的情况下,这意味着应该在不同的目标操作系统上对 shell 代码片段进行集成测试(即,不与操作系统隔离)。而且,生成器将这些片段放在一起的各种方式也应该进行集成测试,以查看它们是否可以在操作系统上很好地运行。

但是,可以有适用于单元测试的 shell 代码。例如,这是在 shell 中执行计算或字符串操作的代码。我什至会考虑调用某些基本工具(如 basename)的 shell 代码适用于单元测试(如果您愿意,可以将此类工具解释为“标准库”的一部分)。在您描述生成的shell代码的情况下

从函数参数创建一个文件名。

这听起来像是“单元测试”shell 代码的一个很好的候选示例:这个文件名创建功能可以放入一个 shell 函数中,然后单独测试。


推荐阅读