我正在爲一項服務開展一些測試自動化工作,並找出一種簡潔的方式將一些常見的設置&驗證卷入「會話」類。如何檢查是否有任何異常已被拋出?
從概念上講,一個測試用例可能是這樣的:
using (var managerSession = new Session(managerRole))
{
// A manager puts some items in warehouse
}
using (var employeeSession = new Session(employeeRole))
{
// An employee moves items from warehouse to store
}
using (var customerSession = new Session(customerRole))
{
// A customer can buy items from the store
}
在Session對象構造我設置爲我和每個角色等適當的認證測試服務的連接,並在會議上的Dispose ()方法我有一個通用的驗證塊,例如,檢查在會話生存期內沒有發生服務器端錯誤或警告。
當然,這是濫用IDispose模式,如果使用塊內的測試代碼引發異常,並且驗證塊也會引發異常,則第二個異常將掩蓋第一個異常。
從概念上講,如果我們有這樣的場景:
using (var managerSession = new Session(managerRole))
{
Assert.IsTrue(managerSession.DoJob(), "Manager did not do his job");
}
...和斷言失敗或調用managerSession.DoJob()拋出一個異常,那麼我想會話的Dispose()方法跳過驗證模塊,即
public void Dispose()
{
if (NoExceptionThrown())
{
Assert.IsFalse(this.serviceConnection.HasErrors(), "Service connection has errors");
}
this.serviceConnection.Dispose();
}
...這樣的測試方法從來沒有失敗,「服務連接有錯誤」,如果它實際上失敗,「經理沒做工作」,
我的問題是:是否可以在這裏實現'NoExceptionThrown()'方法?是否有一些全局屬性可以檢查,或者可以使用Thread.CurrentThread中隱藏的某些東西?
更新:
我的問題是不如何重構這個:-)
我當然可以使用這個模式來代替:
Session.ForRole(managerRole, (session) => { /* Test code here */ });
用靜態方法ForRole()如
public static void ForRole(Role r, Action<Session> code)
{
var session = new Session(r);
try
{
code(session);
Assert.IsFalse(session.serviceConnection.HasErrors());
}
finally
{
session.Dispose();
}
}
但是我很好奇是否存在某種如上所述的抓取異常狀態的方式。
兩件事。首先,是的,這是濫用'IDisposable'。使用'IDisposable'來表示「我擁有應該儘快釋放的非託管資源」。使其意味着別的東西使你的代碼難以閱讀。其次,你是否擔心*任何*異常,或者只*未被捕獲*異常?假設測試代碼拋出一個異常,捕獲它並正常完成。應該標記? –
啊,我只關心_uncaught_異常。我會更新這個問題...... – Christoffer
至於濫用IDisposable:我實際上更關心的是錯過每次會話的常見驗證,而不是潛在的錯誤掩蓋,所以這個問題更多的是「很高興有」功能。實際的測試代碼塊包含10-100行UI自動化代碼,並且我們已經發現缺陷未被發現,因爲驗證步驟中的一個在其中一個塊中錯過了(或報告在錯誤的塊中)。 – Christoffer