靜態協助程式類別
IntelliTest 提供一組靜態的協助程式類別,可以在撰寫參數化單元測試時使用:
- PexAssume:用來在輸入上定義假設,對於篩選不想要的輸入很有幫助。
- PexAssert:當您的測試架構不提供時,可使用的簡易判斷提示類別。
- PexChoose:IntelliTest 管理的其他測試輸入資料流
- PexObserve:記錄具體值,並選擇性地在產生的程式碼中驗證它們
某些類別可讓您與 IntelliTest 推理引擎在低層級進行互動:
- PexSymbolicValue:檢查或修改變數上符號條件約束的公用程式
PexAssume
參數化單元測試中表達假設用的靜態類別,例如先決條件。 此類別的方法可以用來篩選掉不要的測試輸入。
如果某些測試輸入中不含假設條件,就會擲回 PexAssumeFailedException。 這會導致以無訊息模式忽略測試。
範例
下列參數化測試不會考慮 j=0:
public void TestSomething(int i, int j) {
PexAssume.AreNotEqual(j, 0);
int k = i/j;
...
}
備註
上述程式碼幾乎等同於:
if (j==0)
return;
不同之處是失敗的 PexAssume 導致沒有測試案例。 如果是 if 陳述式,IntelliTest 會另外產生測試案例,以涵蓋 if 陳述式的 then 分支。
PexAssume 也包含如字串、陣列和集合上的假設的特殊化巢狀類別。
PexAssert
如果某些測試輸入中不含判斷提示條件,就會擲回 PexAssertFailedException,造成測試失敗。
範例
整數的絕對值是正數的判斷提示如下:
public void TestSomething(int i) {
int j = Maths.Abs(i);
PexAssert.IsTrue(j >= 0);
...
}
PexChoose
為測試提供輔助輸入值的靜態類別,可用以實作參數化模擬。
PexChoose 類別無法協助決定特定輸入值的測試是通過還是失敗。 PexChoose 只提供輸入值,也稱為「選項」。 使用者仍然需要限制輸入值,以及撰寫判斷提示來定義測試何時通過或失敗。
作業模式
PexChoose 類別可在兩種模式下操作:
當 IntelliTest 在輸入產生期間執行測試和受測程式碼的符號分析時,選擇器會傳回任意值,而 IntelliTest 會追蹤每個值在測試和受測程式碼中的使用方式。 IntelliTest 會產生相關的值,在測試和受測程式碼中觸發不同的執行路徑。
針對特定測試案例所產生的程式碼,會以特定方式設定選擇提供者,以便重新執行此類測試案例時會做出特定的選擇,觸發特定的執行路徑。
使用方式
- 簡單呼叫 PexChoose.Value 以產生新值:
public int Foo() {
return PexChoose.Value<int>("foo");
}
PexObserve
記錄具名值的靜態類別。
當 IntelliTest 探索程式碼時,會使用其格式化的字串表示法利用 PexObserve 記錄計算的值。 值與唯一的名稱建立關聯。
PexObserve.Value<string>("result", result);
範例
// product code
public static class MathEx {
public static int Square(int value) { return value * value; }
}
// fixture
[TestClass]
public partial class MathExTests {
[PexMethod]
public int SquareTest(int a) {
int result = MathEx.Square(a);
// storing result
return result;
}
}
PexSymbolicValue
靜態類別,可用來略過參數上的條件約束,以及列印與值建立關聯的符號資訊。
使用方式
在執行期間,IntelliTest 一般會嘗試涵蓋程式碼的所有執行路徑。 不過,它不應該探索所有可能的案例,特別是在運算假設和判斷提示條件時。
範例
本例會示範 PexAssume.Arrays.ElementsAreNotNull 方法的實作。 在方法中,您會忽略陣列值長度的條件約束,以避免 IntelliTest 嘗試產生不同的陣列大小。 只在這裡忽略條件約束。 如果受測程式碼對不同的陣列長度有不同的行為,則 IntelliTest 無法從受測程式碼的條件約束產生不同大小的陣列。
public static void AreElementsNotNull<T>(T[] value)
where T : class
{
PexAssume.NotNull(value);
// the followings prevents the exploration of all array lengths
int len = PexSymbolicValue.Ignore<int>(value.Length);
// building up a boolean value as follows prevents exploration
// of all combinations of non-null (instead, there are just two cases)
bool anyNull = false;
for (int i = 0; i < len; ++i)
anyNull |= value[i] == null;
// was any element null?
if (anyNull)
PexAssume.Fail("some element of array is a null reference");
}
有什麼建議嗎?
在開發人員社群上張貼您的意見與功能建議。