大型專案編譯耗時、自動化測試不足以覆蓋所有場景、有時需人工驗證。OBP 控制台測試框架 是極簡輕量類庫,無 GUI (非 WinForms/Web/Silverlight/WPF),專注於整合前驗證核心業務功能。
Execute)核心抽象類別 CustomConsoleTest:
[TestMethod] 的方法MethodItem 包含 MethodInfo 與顯示文字)Execute() 進入測試迴圈Execute(),構建分層選單
public CustomConsoleTest() {
var t = this.GetType();
int i = 0; string name = null;
foreach (var m in t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) {
if (IsValidMethod(m, ref name)) {
var item = new MethodItem(name, m);
_methods.Add(_menuKeys[i], item);
++i;
}
}
}
public void Execute() {
char c = '*';
while ((c != 'q') && (c != 'Q')) {
foreach (var p in _methods)
Console.WriteLine("{0} - {1}", p.Key, p.Value.DisplayText);
Console.WriteLine("q - Quit");
Console.WriteLine();
c = Console.ReadKey(true).KeyChar;
if (_methods.ContainsKey(c))
try {
var m = _methods[c];
m.Method.Invoke(this, null);
} catch (Exception ex) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("An exception has occured when invoking the method {0}", ex);
}
}
}
protected void DisplayCollection<T>(IEnumerable<T> aCollection) {
if (aCollection.Count() == 0) Console.WriteLine("No item in the collection");
int i = 1; _elts.Clear();
foreach (var e in aCollection) {
Console.WriteLine("{0} - {1}", i, GetDescription(e));
_elts.Add(i, e);
++i;
}
Console.WriteLine();
}
protected T SelectItem<T>(IEnumerable<T> aCollection) where T : class {
DisplayCollection<T>(aCollection);
while (true) {
Console.WriteLine("Type the element number or q to exit");
var text = Console.ReadLine();
if (text == "q" || text == "Q") return null;
try {
int index = Convert.ToInt32(text);
if (_elts.ContainsKey(index)) return (T)_elts[index];
else Console.WriteLine("The list does not contain that number, try again !");
} catch { Console.WriteLine("Wrong value"); }
}
}
class MethodItem {
internal MethodItem(string aDisplayText, MethodInfo aMethod) {
DisplayText = aDisplayText; Method = aMethod;
}
internal string DisplayText { get; private set; }
internal MethodInfo Method { get; private set; }
}
業務物件:Machine (含 List<SparePart>)、SparePart。三測試類:
MachineTest:列出機器、自訂 GetDescription 顯示名稱/重量/零件數PartTest:選擇單一零件測試,使用 SelectItemSoftwareTest:根選單,巢狀調用 MachineTest.Execute()、PartTest.Execute()
class SoftwareTest : CustomConsoleTest {
private MachineTest _machineTest = new MachineTest();
private PartTest _partTest = new PartTest();
[TestMethod("Machines")] private void ExecuteMachineTest() { _machineTest.Execute(); }
[TestMethod("Parts")] private void ExecutePartTest() { _partTest.Execute(); }
static SoftwareTest() { Machine.CreateInstances(); SparePart.CreateInstances(); }
}
自動化測試雖好,特殊情境仍需人工介入。控制台測試無 GUI 開銷、啟動極快、專注核心業務驗證,是大型系統開發中極具實戰價值的補充驗證手段。