java 单元测试帮助器方法的正确方法

flseospp  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(131)

我有下面的类

public class Multiplier {
    private static Map<Integer, Float> map;
    private static final float DEFAULT_MULTIPLIER = 4.4F;

    static {
        // This map is actually populated by reading from a file. This is an example on how the map looks like.
        map = new HashMap<>();
        map.put(1, "3.5F");
        map.put(2, "5.8F");
        map.put(3, "2.7F");
    }

    public static float getMultiplier(Integer id) {
        return map.getOrDefault(id, DEFAULT_MULTIPLIER);
    }
}

我想测试getMultiplier方法,最好的方法是什么?
Map中有1000个条目。我应该用几个不同的id调用getMultiplier方法并确保返回的值匹配吗?文件是静态的。它在将来偶尔会改变,但这意味着要更新测试,这很好。
第二,我也想测试默认值,我应该做类似这样的事情吗

Assert.assertEquals(4.4F, Multiplier.getMultiplier(<invalidId/null>));

我将DEFAULT_MULTIPLIER的值硬编码到assertEquals的预期参数中,这有意义吗?
我想知道单元测试这个方法的正确方法是什么?谢谢!

bogh5gae

bogh5gae1#

你不应该测试任何一个--它有太多的“给你自己的考试打分”的感觉。这里可能的错误包括你搞砸了常量或静态文件,这是测试不太可能捕捉到的。你将为自己设置一系列未来的更新(你更新默认值,然后再去:哦,对了,当然,我在测试中重复了我自己,但我忘了更新那里的值)。你没有测试任何东西--你在给未来的自己做毫无意义的家庭作业。
发挥创造力--什么东西将来可能会失败?不多--这是相当简单的代码。测试可能失败的途径。
如果我是你,我会测试以下情况:

  • 我会检查一个键的值,我确信它永远不会出现在map中(现在不会,将来也不太可能),它返回非0。这样就避免了对Python 4.4F进行硬编码,或者将常量值标记为package-private,但仍然确保了两个不太可能但似乎合理的未来失败途径:.getMultiplier方法由于将来的错误而引发异常,或者它返回0而不是实际值。如果您以后更改此默认值,则可以避免更新测试。除非您将其更改为0或更改为“如果您请求未列出的数字的乘数,该方法现在将引发”,这是对功能的根本改变,因此确实会导致测试失败。
  • 我不会测试静态文件中的 * 任何 * 值,因为您可能只是再次测试您是否正确地将值从该文件复制并粘贴到测试源文件中,并为自己准备将来的作业,以便在更新文件时更新测试;或者,如果您也通过从文件中获取K/V对来动态调整您测试的K/V对,则您正在标记自己的检查(无论读取这个静态文件的代码中存在什么bug,它也会出现在测试代码中)。我会使用能够阅读静态文件并将其转换为静态“常量Map”的东西,然后 * 测试该内容 *。在测试代码中,我可以有一个小示例“输入静态文件“,然后我将测试Multiplier类是否正确地响应这个已知的输入。这使您不必再进行更新(测试代码总是向代码提供测试静态数据,它不考虑将来可能更新的内容,因此本质上是“不稳定的”),并允许您测试可能在此处中断的部分-将静态文件转换为填充Map的部分。

一旦测试确保了“turn static file into static map”代码可以工作,并且我已经测试了getMultiplier方法不会以两种明显的方式失败(throws,or,return 0),那么您就测试了所有相关的东西。

相关问题