Skip to main content

Picire Parallel Delta 调试框架

项目描述

并行 Delta 调试框架

https://img.shields.io/pypi/v/picire?logo=python&logoColor=white https://img.shields.io/pypi/l/picire?logo=open-source-initiative&logoColor=white https://img.shields.io/github/workflow/status/renatahodovan/picire/main/master?logo=github&logoColor=white https://img.shields.io/coveralls/github/renatahodovan/picire/master?logo=coveralls&logoColor=white

Picire(发音为 /pitsirE/)是 Delta 调试算法的 Python 实现,支持并行化和进一步的配置选项。它既可以用作命令行工具,也可以用作库。

就像原始算法一样,Picire 会自动减少“有趣”的测试,同时保持其“有趣”的行为。一个常见的用例是最小化失败的测试,以便它们仍然重现原始失败。

该工具(和算法)以迭代方式工作。作为第一步,它将输入按行或字符分成n 个块。然后,它迭代地检查由这些块组成的较小的测试用例是否仍然有趣。块的选择可以通过两种方式进行:要么保留一小部分块(基于子集的归约),要么删除该小子集并保留其他所有内容(基于补集的归约)。如果找到一个新的有趣的测试用例,它就成为下一次迭代的输入。如果删除任何进一步的块会使测试变得无趣(例如测试是1-minimal),则迭代停止。

要求

安装

要在另一个项目中使用Picire,可以将其添加到setup.cfg作为安装要求(如果使用带有声明性配置的setuptools):

[options]
install_requires =
    picire

要手动安装Picire,例如,安装到虚拟环境中,请使用pip

pip install picire

上述方法从PyPI安装最新版本的Picire。或者,对于开发版本,克隆项目并执行本地安装:

pip install .

用法

Picire有两个强制性的命令行参数:一个定义要减少的输入测试用例(--input),另一个描述可执行测试脚本或程序(--test),它可以决定任意输入的趣味性。这将在每次迭代中运行以检查测试用例。

常用设置

  • --parallel:使Picire能够在多进程模式下运行。(否则,将运行原始的单进程变体。)

  • -j <num>:定义并行作业的最大数量。

  • --combine-loops:基本算法在子集和基于补码的减少循环之间存在依赖关系,但由于其实现的顺序性,它对效率没有影响。然而,在并行模式中,这种分离成为潜在的次优。使用此选项,两个 reduce 循环组合运行以提高性能。引用的论文中提供了有关算法变体的更多详细信息。

  • --complement-first:对于某些输入类型,基于子集的减少不如基于补码的有效(有时,积极地删除输入的太大部分也会消除兴趣)。默认情况下, Picire在基于补码的归约之前执行基于子集的归约,这可能导致对此类输入进行许多多余的检查。该标志强制从补码检查开始。

  • --subset-iterator / --complement-iterator:指导子集和基于补码的reduce循环的迭代策略。

    • forward:从输入的开头开始调查子集(或补集)。

    • 后向:从输入的末尾开始研究子集(或补集)。目标是减少语义冲突的数量(假设定义 - 如变量声明 - 出现在使用之前)。

    • skip:完全避免子集或补集检查(主要与--subset-iterator一起使用)。

有关详细选项,请参阅picire --help

测试脚本

测试程序脚本应该采用一个命令行参数,即测试用例的路径,如果测试很有趣,它必须以 0 退出,否则必须以非零退出。运行任意目标应用程序并检查它是否在断言上失败的示例测试器脚本可能如下所示:

#! /bin/bash
timeout --foreground 10 <path/to/the/target/application> $1 2>&1 | grep -q "Assertion failed";

评论:

  • < path/to/the/target/application>应该是目标应用程序的绝对路径,或者应用程序应该在搜索路径上(即 $PATH)。

  • $1是包含测试用例路径的单一且强制的命令行参数。

  • 如果不能保证目标应用程序退出,那么值得在超时的情况下运行它以限制等待产生预期行为的时间量。

  • 如果目标在超时的情况下运行,那么--foreground标志也很有用,因为它允许通过超时的进程组转发KILL信号(由并行实现使用)。这使我们能够在已经找到新的有趣配置时停止所有活着的并行进程。

  • 如果兴趣决定是基于输出的内容,那么使用grep(可能使用-q--quiet)可能是一个正确的选择,因为如果找到了模式,它返回 0,否则返回 1。正是Picire期望的返回值。

Picire的一种常见用法:

picire --input=<path/to/the/input> --test=<path/to/the/tester> \
       --parallel --subset-iterator=skip --complement-iterator=backward

兼容性

Picire在以下设备上进行了测试:

  • Linux (Ubuntu 14.04 / 16.04 / 18.04 / 20.04)

  • OS X / macOS (10.11 / 10.12 / 10.13 / 10.14 / 10.15 / 11)

  • Windows(服务器 2012 R2/服务器版本 1809/Windows 10)

致谢和引文

该软件使用如下所述的 delta 调试算法:

  • 安德烈亚斯·泽勒。昨天,我的程序成功了。今天,它没有。为什么?在与第 7 届 ACM SIGSOFT 软件工程基础研讨会 (ESEC/FSE '99) 联合举行的第 7 届欧洲软件工程会议论文集中,计算机科学讲义 (LNCS) 第 1687 卷,第 253-267 页,图卢兹,法国,1999 年 9 月。斯普林格。 https://doi.org/10.1007/3-540-48166-4_16

  • 拉尔夫·希尔德布兰特和安德烈亚斯·泽勒。简化导致故障的输入。在 2000 年 ACM SIGSOFT 国际软件测试和分析研讨会 (ISSTA '00) 论文集上,第 135-145 页,美国俄勒冈州波特兰市,2000 年 8 月。ACM。 https://doi.org/10.1145/347324.348938

进一步的改进描述在:

  • 雷娜塔霍多万和阿科斯之吻。最小化 Delta 调试算法的实际改进。第 11 届国际软件技术联合会议论文集 (ICSOFT 2016) - 第 1 卷:ICSOFT-EA,第 241-248 页,葡萄牙里斯本,2016 年 7 月。SciTePress。 https://doi.org/10.5220/0005988602410248

  • Renata Hodovan、Akos Kiss 和 Tibor Gyimothy。用于高效分层 Delta 调试的树预处理和测试结果缓存。在第 12 届 IEEE/ACM 软件测试自动化国际研讨会论文集 (AST 2017),第 23-29 页,阿根廷布宜诺斯艾利斯,2017 年 5 月。IEEE。 https://doi.org/10.1109/AST.2017.4

  • 阿科斯之吻。推广最小化 Delta 调试算法的拆分因子。IEEE 访问,8:219837-219846,2020 年 12 月。IEEE。 https://doi.org/10.1109/ACCESS.2020.3043027

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

picire-21.8.tar.gz (29.0 kB 查看哈希

已上传 source

内置分布

picire-21.8-py3-none-any.whl (28.5 kB 查看哈希

已上传 py3