我的測驗的排列塊中存在并發問題,我確實在子檔案夾中創建了一些檔案(在某些測驗用例運行中檔案訪問的 IO 例外)。我有一個引數化測驗,盡管有[NonParallelizable]屬性,但測驗用例似乎并行運行。
在 VS2019 的 Test-Explorer 中運行的測驗中觀察到該問題。
是否有可能阻止某些測驗的測驗用例并行執行,如果夾具中的另一個測驗(不是測驗用例)仍然可以并行運行,那就太好了。
[TestFixture]
public class ClassToTest_Fixture
{
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[TestCase("SubFolder", new[] { "a", "b", "c", "d", "e", "f", "g", "h" })]
[NonParallelizable] //Doesn't help
public void TestMethod(string folder, string[] files)
{
#region Arrange
var fldr = Path.Combine(TestContext.CurrentContext.TestDirectory, folder);
if(!Directory.Exists(fldr))
{
Directory.CreateDirectory(fldr);
}
foreach(var fn in files)
{
File.Create(Path.Combine(fldr, fn));
}
#endregion Arrange
//Act
//Assert
}
[Test]
public void TestMethodCanBeRunInParallel( )
{
}
}
uj5u.com熱心網友回復:
簡短回答:這目前不起作用,請參閱https://github.com/nunit/nunit/issues/3371
更多的...
由于 的操作ParallelizableAttribute始終與更高級別測驗(夾具、命名空間、程式集)的并行狀態相關,因此您應該在問題中指定該屬性是用于同一命名空間中的夾具、程式集還是 setupfixture。我假設必須有一些更高級別的設定,否則您不需要在[NonParallelizable]這里使用,但我不知道該設定是什么。:-) 如果你澄清它,我會編輯它。
如果您希望各個案例并行運行,而更高級別的設定是非并行的,則會出現類似的問題。使用[Parallelizable(ParallelScope.Children)]``. m Unfortunately, the NonParallelizableAttribute doesn't take a scope argument and is simply a synonym for[Parallelizable(ParallelScope.Nonein)]`很容易解決這個問題。我認為這是我最初設計中的一個錯誤,也許當前團隊會在未來的版本中糾正它。
解決方法...
最簡單的方法是使包含這些方法的夾具不可并行化。這可能也可能不可能,這取決于您的應用程式的詳細資訊,您是否有引數化的夾具等。您也可以嘗試
[Parallelizable(ParallelScope.Fixture)]使用夾具。這應該允許夾具,而不是它的孩子,并行運行。更復雜,可能會讓你的團隊感到困惑......添加另一個夾具類并標記它
[NonParallelizable]。如果愿意,您可以嵌套它,但不要從第一個類派生它,因為這會導致所有包含的測驗運行兩次。將方法與所有案例一起復制到新類中,這些案例可能不會并行運行。
如果是我的問題,我會傾向于第一種方法,即使性能會受到一些影響。開發人員時間通常是您在測驗撰寫中想要優化的時間,至少在您實際測量一個重要問題之前是這樣。
然后,您可以等著看下一個 NUnit 版本會帶來什么。:-)
uj5u.com熱心網友回復:
我有一個并發問題......測驗用例似乎并行運行是一個錯誤的假設,這是我憑直覺做出的。在我添加了一個帶有時間戳的輸出之后,Thread.CurrentThread.ManagedThreadId我發現即使沒有[NonParallelizable]屬性,測驗用例也會非并行運行。
問題是(我的錯),我沒有足夠注意 的回傳值File.Create(fileName),它是一個FileStream.
由于我沒有處理FileStream下一個測驗用例運行時遇到問題(IO 例外)。
添加FileStream.Close()已解決問題:
...
File.Create(Path.Combine(fldr, fn))?.Close();
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352796.html
