安全发布的单元测试

时间:2008-10-14 13:07:18

标签: java unit-testing concurrency junit

您如何在Java中单独测试安全发布保证?

具体:

我有一个Cache接口,它有一个getOrLoad方法(K键,ObjectLoader加载器)。事实是,如果Cache无法找到给定键的对象,那么它必须从ObjectLoader实例加载它。但是,需要Cache来保证从加载器加载对象并将其放入Cache中的行为构成一个安全的出版物。

我现在正在为这个Cache接口编写一个通用的junit测试,我想知道如何测试Cache实现是否遵循这个安全的发布保证。

有什么想法吗?如果您想要查看真实文件,实际代码位于code repository的test-systest模块部分。

3 个答案:

答案 0 :(得分:1)

也许您可以使用ConTest至少让您更加确信您的代码是正确的。

您需要实现几个同时运行多个线程的测试。然后,ConTest将通过检测字节代码来增加实际显示并发错误的可能性(添加启发式控制的条件睡眠和产生指令)。

答案 1 :(得分:1)

我发现了Bill Pugh,Brian Goetz和Cliff的JavaOne presentation点击测试并发代码的主题。他们提出了这种方法,我认为这是我听过的最好的方法:

许多生成器使用依赖于状态的hashCode实现创建有状态和线程不安全的对象。当对象通过假定的同步点发送时,hashCodes被总结(线程本地)。同样,门的另一侧的消费者总结了hashCodes。

在测试结束时,我们分别总结了生产者和消费者的所有结果。如果两个总和相等,则测试通过。

我们也可以使用XOR作为总和的替代方案。事实上,任何交换操作都可以。请记住,测试工具本身不得引入任何其他同步。

答案 2 :(得分:0)

实际上由于不安全的发布而导致错误是非常困难的(如果有人知道如何,请告诉我)。静态分析是自动化解决方案的最佳选择。我会坚持代码审查,而不是过分担心它。