我有一個演算法可以檢查給定字串串列中的哪個字串與另一個給定字串最匹配,它是-
String calcMostMatching(String mainStr, List<String> strings) {
String mostMatching = null;
if (strings.size() == 1) {
// if size is 1, return the only present string.
mostMatching = strings.get(0);
} else {
// This algorithm also works for size() == 1 but I don't
// want to use it when size() == 1
char[] charArrayOfMainStr = mainStr.toCharArray();
for (String str : strings) {
char[] charArrayOfStr = str.toCharArray();
int min = Math.min(charArrayOfMainStr.length, charArrayOfStr.length)
for (int i = 0; i < min; i ) {
int count = 0;
if (charArrayOfMainStr[i] == charArrayOfStr[i]) {
count ;
} else {
break;
}
}
// Now I store the value of count for
// each string but let us say a method like str.setCounter(count);
}
// Now I will iterate over the loop to check the mostMatchingString
mostMatching = strings.get(0);
for (int i = 1; i < strings.size(); i ) {
if (mostMatching.getCounter() < strings.get(i).getCounter()) {
mostMatching = strings.get(i);
}
}
}
return mostMatching;
}
現在坑測驗失敗了-
if (strings.size() == 1) {
mostMatching = strings.get(0);
}
說替換strings.size() == 1為false但仍然所有的測驗用例都通過了。是的,所有測驗用例都會通過,但是當串列只有一個值時,我想降低時間復雜度。
如果你不知道坑測驗,有人可以幫我修改這個演算法,這樣它就不會在size() == 1我做過的事情之外進入回圈。
注意 -這不是真正的代碼,我將其簡化為最小的可重現示例,實際代碼是不同的且相當復雜,它檢查各種引數,而不僅僅是比較getCounter()值。
我怎樣才能殺死這個突變,或者我必須忽略它。
uj5u.com熱心網友回復:
由于性能不是通過單元測驗衡量的代碼屬性,因此僅用于優化性能的代碼將導致無法殺死的等效突變。
作為臨時練習,您也可以進行 pitest run 性能測驗,但這會很困難,因為它們通常會給出定量結果,而不是布林值通過/失敗。它也會非常緩慢。
由于您的優化是針對 n 較低的情況,因此衡量可觀察到的改進將特別困難。可能這里根本沒有實際改進。除非您的性能測量證明其存在是合理的,否則最簡單的方法是通過洗掉 if 陳述句來降低代碼的復雜性。
uj5u.com熱心網友回復:
說用 false 替換了 strings.size() == 1 但仍然所有的測驗用例都通過了。
因此,如果測驗失敗,那么 PiTest 會很高興。我建議您增加單元測驗的范圍以覆寫執行路徑。說,如果你有這樣的代碼 -
String calcMostMatching(String mainStr, List<String> strings) {
String mostMatching = null;
if (strings.size() == 1) {
// if size is 1, return the only present string.
mostMatching = strings.get(0);
} else {
// move the complex code to another method
mostMatching = doSomeComplexAlgo(mainStr, strings);
}
return mostMatching;
}
String doSomeComplexAlgo(String mainStr, List<String> strings) {
// do something complex
return strings.get(0);
}
在單元測驗中,我們添加了另一種verify方法。它驗證doSomeComplexAlgo未使用單個字串串列呼叫方法。現在,如果 PiTest 測驗更改了size,則測驗應該會失敗,因為doSomeComplexAlgo將被呼叫 -
@Test
public void testCalcMostMatchingWithSizeOne() {
SomeTestClass someTestClass = Mockito.spy(new SomeTestClass());
String result = someTestClass.calcMostMatching("", List.of("A"));
// This will fail if the mutation testing changes the List length
Mockito.verify(someTestClass, Mockito.times(0)).doSomeComplexAlgo(Mockito.anyString(), Mockito.anyList());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340387.html
