gpt4 book ai didi

java - 如何简化 Java 中无副作用方法的测试?

转载 作者:行者123 更新时间:2023-11-29 09:50:55 27 4
gpt4 key购买 nike

函数(没有副作用的函数)是一个基本的构建 block ,但我不知道在 Java 中有什么令人满意的测试方法。

我正在寻找使测试更容易的技巧的指针。这是我想要的示例:

public void setUp() {
myObj = new MyObject(...);
}

// This is sooo 2009 and not what I want to write:
public void testThatSomeInputGivesExpectedOutput () {
assertEquals(expectedOutput, myObj.myFunction(someInput);
assertEquals(expectedOtherOutput, myObj.myFunction(someOtherInput);
// I don't want to repeat/write the following checks to see
// that myFunction is behaving functionally.
assertEquals(expectedOutput, myObj.myFunction(someInput);
assertEquals(expectedOtherOutput, myObj.myFunction(someOtherInput);

}


// The following two tests are more in spirit of what I'd like
// to write, but they don't test that myFunction is functional:
public void testThatSomeInputGivesExpectedOutput () {
assertEquals(expectedOutput, myObj.myFunction(someInput);
}

public void testThatSomeOtherInputGivesExpectedOutput () {
assertEquals(expectedOtherOutput, myObj.myFunction(someOtherInput);
}

我正在寻找一些可以放在测试、MyObject 或 myFunction 上的注释,以使测试框架自动重复对 myFunction 的调用,以我给出的给定输入/输出组合的所有可能排列,或者一些可能排列的子集,以证明函数是函数式的。

例如,上面的(唯一的)两种可能的排列是:

  • myObj = new MyObject();
  • myObj.myFunction(someInput);
  • myObj.myFunction(someOtherInput);

和:

  • myObj = new MyObject();
  • myObj.myFunction(someOtherInput);
  • myObj.myFunction(someInput);

我应该只能提供输入/输出对 (someInput, expectedOutput) 和 (someOtherInput, someOtherOutput),其余的应该由框架来完成。

我没有使用过 QuickCheck,但它似乎不是解决方案。它被记录为生成器。我不是在寻找一种方法来为我的函数生成输入,而是在寻找一个框架,它可以让我声明性地指定我的对象的哪一部分是无副作用的,并使用基于该声明的一些排列来调用我的输入/输出规范。

更新:我不打算验证对象是否发生任何变化,内存功能是此类测试的典型用例,而内存器实际上会改变其内部状态。然而,给定一些输入的输出始终保持不变。

最佳答案

如果您正在尝试测试函数是否没有副作用,那么使用随机参数调用并不能真正解决问题。这同样适用于具有已知参数的随机调用序列。或伪随机,具有随机或固定种子。很有可能(有害的)副作用只会发生在随机化器选择的任何调用序列中。

也有可能在您进行的任何调用的输出中实际上看不到副作用……无论输入是什么。它们的副作用可能会作用于您没有考虑检查的其他一些相关对象。

如果你想测试这种东西,你真的需要实现一个“白盒”测试,你可以在其中查看代码并尝试找出可能导致(不需要的)副作用的原因并创建基于在那个知识上。但我认为更好的方法是仔细的手动代码检查,或使用自动静态代码分析器……如果您能找到适合您的工具。

OTOH,如果您已经知道这些函数没有副作用,那么“以防万一”实现随机测试有点浪费时间,IMO。

关于java - 如何简化 Java 中无副作用方法的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com