問題をシミュレートして失敗する高速な機能テストとは異なる一連のパフォーマンス テストで単体テストを作成し、テストが成功するように問題を修正できるようにしたいと考えています。たとえば、実行時間の制約が 20 ミリ秒の場合、20 ミリ秒を超えるとテストは失敗し、それ以外の場合は合格となります。また、メモリ消費の制約を設定したい場合、消費が制約を超えている場合、テストは失敗する必要があります。メモリ消費の制約があるテストを書くことは可能ですか?
1766 次
2 に答える
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);
}
}
于 2013-03-16T17:08:03.930 に答える
2
タイミング制約については、使用する@org.junit.rules.Timeout
か (ルールの目的ではない可能性があります)、独自のバリエーションを記述できます。メモリ制約についてはorg.junit.rules.TestRule
、テスト前後のメモリ使用量を比較する を記述できます。メモリ使用量を測定する 2 つの方法は、java.lang.Runtime
クラスと JMX です。
パフォーマンスは多くの要因 (CI サーバーの負荷、jit されたコードの量など) に依存するため、結果が決定的/安定するかどうかはまだわかりません。テストを何度も実行して平均を比較することをお勧めします。
于 2013-02-18T10:46:53.513 に答える