复杂度测试

1.忽略复杂度方面,根据多次执行执行,对时间断言
2.针对复杂度顺序表中下一个复杂度判断,预测复杂度为O(log(n)),测试复杂度不是O(n)
复杂度测试不会很准确,需要有误差判断,在一定范围内符合就可以,此处我们默认误差10%
使用第二种方法,相对度量测试方法
预期复杂度为O(n),那么将输入扩大十倍,响应时间增加十倍
复杂度为O(log(n)),那么assertApproximateEquals(largetime/smallTime, (float) Math.log(ratio));
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* 测试代码复杂度测试方法
* @author hzweisc
*
*/
public class NewTest {
public int measureArithmetic(int size) {
//业务代码
System.out.println(size);
return size;
}
/**
* 测试近似相等
*/
public void assertApproximateEquals(float actual,float expected) {
float min = (float) (expected * 0.9);
float max = (float) (expected * 1.1);
assert(min<actual && actual <= max);
}
@Test(dataProvider = "dp")
public void f(int datasize) {
int ratio = 10;
int smallTime = measureArithmetic(datasize);
int largetime = measureArithmetic(datasize*ratio);
assertApproximateEquals(largetime/smallTime, ratio);
//assertApproximateEquals(largetime/smallTime, (float) Math.log(ratio));
}
@DataProvider
public Object[][] dp() {
return new Object[][] { new Object[] { 1000 }, new Object[] { 100000 }, };
}
}