2017-08-28 141 views
0

在我們的應用程序中,我需要打開3個完全相同的文檔,對於每個文檔我有一個帶有唯一定位器的按鈕,因爲我們正在並行執行測試,我需要知道哪個文檔已經打開並打開另一個文檔沒有使用,我無法並行打開一個文檔。我的場景應共享打開哪個文檔的狀態以及哪些文檔可供編輯。是否有可能在不同場景之間共享這些數據?在specflow場景之間共享數據

我檢查了所有可能的東西IObjectContainer並創建了GlobalContainer使用var Container = new ContainerBuilder().CreateGlobalContainer();,但沒有任何效果。

UPDATE:

解決方案已經發現,我們應該通過TestThreadContext到鉤構造,但這隻會工作,如果我們將使用一個線程:

private readonly TestThreadContext _context; 

private Hooks(ScenarioContext scenarioContext, TestThreadContext context) 
    { 
     ScenarioContext = scenarioContext; 
     _context = context; 
     if (!_context.TestThreadContainer.IsRegistered<Dictionary<int, bool>>("myObject")) 
      _context.TestThreadContainer.RegisterInstanceAs(MyDictionary, "myObject"); // you can register any object not only dictionary. 
    } 

    [BeforeScenario] 
    private void BeforeScenario() 
    { 
     var myDictionary = _context.TestThreadContainer.Resolve<Dictionary<int, bool>>("myObject"); // to get your dictionary back from container 
    } 

如果你想與大家分享在並行測試場景之間的數據,你應該在GlobalStep(SpecRun)中創建新的AppDomain,然後將數據和方法傳遞給這個應用程序域,這些數據和方法可以返回數據和更新數據,這可以使用yourDomain.SetData("youKey", new yourClass)完成,然後在Hooks中,域(how to get required app domain),並從域名獲得您添加的類var data = domain.GetData("yourKey"),然後您可以調用您的方法data.YourMethod();也應該使用lock(object) {your code}鎖定方法內的線程安全線程安全。

回答

0

爲什麼不創建具有指定ID這樣打開一個文檔的一般步驟:

[Then(@"User opens document with ID ""(.*)""")] 
public void ThenUserOpensTheDocument(string docId) 
{ 
} 

,然後從Specflow scenarious這樣稱呼它:

User opens document with ID "1234567" 

所以你會從不同的測試場景中調用這個步驟3次,每個調用都擁有自己的文件ID。

+0

因爲我們無法訂購測試場景,所以有時候這個文件會打開兩次, ID。 –

1

我不確定自己完全瞭解情況。通常,您可以通過兩種不同的方式並行運行測試(使用SpecRun alias SpecFlow + Runner),解決方案也取決於您使用的是哪一種。

  1. 您可以在appdomain隔離中運行測試線程。在這種情況下,爲每個線程創建一個新的AppDomain。 AppDomain具有獨立的內存,因此您無法創建可從所有線程訪問的「全局」字典。在這種情況下,您必須以其他方式共享狀態,例如在臨時文件夾中創建空文件。 (您可以根據您的文檔命名文件,如mydoc1.lock,並檢查是否存在文件,相應地創建/刪除文件。)

  2. 您可以在同一個appdomain中運行測試。 (這也是你可以用xunit/nunit做的。)在這種情況下,你可以簡單地爲字典聲明一個靜態字段,並且它將在所有線程中共享。 (當然,您必須保護您的讀寫操作,因爲字典默認情況下不是線程安全的。)

+0

它可能在域之間共享數據。不過謝謝你的回答:) –