- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在试验 junit5 和 pitest。我的测试代码如下所示:
// [...]
InputStream istream = this.getClass().getResourceAsStream("/" + file.getName());
if (istream == null) // 1. negated condition -> suvived
{
istream = Files.newInputStream(this.files.get(varname).toPath(), StandardOpenOption.READ);
}
try (BufferedReader reader = new BufferedReader(new InputStreamReader(istream, StandardCharsets.UTF_8))) // 2. removed call to java/io/BufferedReader::close → SURVIVED // 3. removed call to java/lang/Throwable::addSuppressed → SURVIVED
{
// [...]
} // 4. removed call to java/io/BufferedReader::close → SURVIVED
在这个小代码块中,我留下了 4 个我想杀死的幸存突变。可以通过添加/更改测试或重构代码来终止。
我现在的问题是第一个突变是一个等效的突变——我不知道如何重构它。其他三个突变由 try-resource-statement 隐含。
所以我的问题是如何重构这 4 个突变?因为我确信它们不会被额外/更改的测试杀死。
最佳答案
只有当函数的可观察行为在 if 语句的两边相同时,第一个突变体才是等价的。
对于这种情况,'file' 和 'this.files.get(varname)' 需要始终解析为相同的输入流。
如果它们可以解析为不同的输入流,则可以构建一个测试来杀死突变体。
如果他们总是解决同一件事,那么为什么需要第一个分支?除非它存在某些无法测试的问题(例如性能),否则不需要第一个分支并且流总是可以从“this.files.get(varname).toPath()”解析。
其他突变体有点棘手。
它们是等价的,因为它们处理的是不可单元测试的问题(资源管理)。更重要的是,它们是“垃圾”,因为它们是编译器构造,不会直接映射回代码。
Pitest 试图过滤掉像这样的垃圾突变体,但过滤并不完美,因为它们在字节码中没有被清楚地识别为编译器构造。
如果我将您的代码片段粘贴到一个文件中并进行编辑以便编译,1.4.8 版本会正确地过滤掉所有这些突变体。如果您可以粘贴一个完整的可编译类来重现该问题,我可以看看是否可以调整过滤以在上下文中提取这些突变体。
关于java - 如何重构 try-resource 和等效突变体的幸存突变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433532/
我是一名优秀的程序员,十分优秀!