作爲受試者,我想生成測試數據,以覆蓋所有對於一些邏輯表達的可能的條件等如下:如何根據邏輯表達式生成測試數據?
((a==3000710)||(b==3000700))
&&(b>=30 && b<=33)
&&((c==1)||(c>=4 && c<=6))
&&((v==1.0.9)||(v==2.0.0))
任何評論是受歡迎的。
順便說一句,邏輯表達式是一個簡化的規則,應用在我們的後端服務器上。
作爲受試者,我想生成測試數據,以覆蓋所有對於一些邏輯表達的可能的條件等如下:如何根據邏輯表達式生成測試數據?
((a==3000710)||(b==3000700))
&&(b>=30 && b<=33)
&&((c==1)||(c>=4 && c<=6))
&&((v==1.0.9)||(v==2.0.0))
任何評論是受歡迎的。
順便說一句,邏輯表達式是一個簡化的規則,應用在我們的後端服務器上。
我必須說的第一件事 - 重構它! 將其分解爲幾個if語句,這些語句將更容易驗證,反轉邏輯並提前退出。沒有看到實際的代碼和上下文,就很難給出更詳細的建議。
另一件事,如果(b == 3000700)
,那麼&&(b>=30 && b<=33)
返回false,這使得這部分語句||(b==3000700)
毫無意義。也許它應該是(a == 3000700)
?
關於測試案例......然而,又沒有看到完整的代碼片段和知道上下文,提供有意義的建議有點困難。但我會嘗試。
讓我們看看每個變量的「臨界值」。
3000710
,任何其它3000700, [30, 33], any other
1, [4, 6], any other
1.0.9, 2.0.0, any other
使用測試理論(等價類劃分和邊界值分析),我們可以限制上述「關鍵」值的列表。
[30, 33] => 30, 31, 33 (The value outside of this range is already covered by "any other")
[4, 6] => 4, 5, 6 (The value outside of this range is already covered by "any other". Though we did't really change anything in this case)
NUnit的具有產生測試用例提供用於試驗的參數的各個數據項的所有可能組合的屬性[Combinatorial]
。
*假設提出:變量a, b, c
都是int類型,變v
是字符串
的代碼看起來類似的東西:
[Test, Combinatorial]
public void FirstTest(
[Values(3000710, 0)] int a,
[Values(30, 31, 33, 3000700, 0)] int b,
[Values(1, 4, 5, 6, 0)] int c,
[Values("1.0.9", "2.0.0", "")] string v)
{
RunTestMethod(a, b, c, v);
}
你只需要存儲的測試執行生成的測試數據
您好@buxter,非常感謝您的詳細解答。你對(a == 300700)的價值是正確的,這確實是錯字。你的方法是可行的。我認爲我們可以進一步使用「程序靜態分析」等技術來自動生成所有臨界值,但我對這些領域並不熟悉,您是否可以點亮這一點?再次感謝。 – user940178
這是C#中的一個單元測試,使用Nunit框架。它具有用於參數化測試的內置屬性[Combinatorial]。所以當測試運行時,它收集所有的輸入數據並生成所有可能的變化。在給定的例子中,它在關鍵點上創建了所有可能的變體。其他單元測試框架可能有類似的東西。希望它能回答你的問題 – buxter
您應該指定所使用的技術,以便其他人可以將您指向相關資源。你使用什麼編程語言和測試框架? – vijoc
其實我不在乎語言,只想找一個可行的方法(算法)或開源工具來解決問題。 – user940178