我希望能够在一组性能测试中编写单元测试,这些测试不同于模拟问题和失败的快速功能测试,纠正测试通过的问题。例如,当执行时间约束为20毫秒时,如果超过20毫秒,则测试必须失败。如果我想设置内存消耗约束并且如果消耗超过约束,那么测试必须失败。我是否可以编写具有内存消耗约束的测试?
答案 0 :(得分:3)
程序的总使用/可用内存可以通过java.lang.Runtime.getRuntime()
在程序中获得。
运行时有几种与内存相关的方法。
以下编码示例演示了它的用法。
package test;
import java.util.ArrayList;
import java.util.List;
public class PerformanceTest {
private static final long MEGABYTE = 1024L * 1024L;
public static long bytesToMegabytes(long bytes) {
return bytes / MEGABYTE;
}
public static void main(String[] args) {
// I assume you will know how to create a object Person yourself...
List<Person> list = new ArrayList<Person>();
for (int i = 0; i <= 100000; i++) {
list.add(new Person("Jim", "Knopf"));
}
// Get the Java runtime
Runtime runtime = Runtime.getRuntime();
// Run the garbage collector
runtime.gc();
// Calculate the used memory
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Used memory is bytes: " + memory);
System.out.println("Used memory is megabytes: "
+ bytesToMegabytes(memory));
}
}
使用System.currentTimeMillis()
获取开始时间和结束时间并计算差异。
class TimeTest1 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long total = 0;
for (int i = 0; i < 10000000; i++) {
total += i;
}
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime);
}
}
答案 1 :(得分:2)
对于时间限制,您可以使用@org.junit.rules.Timeout
(尽管可能不是规则的含义)或编写您自己的变体。对于内存约束,您可以编写一个org.junit.rules.TestRule
来比较测试前后的内存使用情况。测量内存使用的两种方法是java.lang.Runtime
类和JMX。
由于性能取决于许多因素(CI服务器的负载,已经插入的代码数量等),因此结果是否足够具有结论性/稳定性还有待观察。最好多次运行测试并比较平均值。