[英]Repeat mstest test run multiple times
我的一些mstest單元測試有助於檢測多線程競爭條件,因此它們在連續多次運行時最有用,但我只想在特定的測試運行中執行此操作 - 而不是所有時間。
有沒有辦法配置mstest(最好在測試列表編輯器中)多次運行測試?
我需要做類似的事情,所以我想出了一個解決方案。
這並不簡單,但一旦設置完畢,您就可以在項目中重復使用它。 我也在GitHub上下載了這段代碼( https://github.com/johnkoerner/MSTestLooper ),但是如果在某些時候消失了,我就是這樣做的。
首先,我們創建一個屬性,我們將應用於我們的類,告訴它多次運行所有測試。 在單獨的程序集中完成所有這些操作,因為DLL需要位於特殊位置。
[Serializable]
public class TestLooperAttribute : TestClassExtensionAttribute
{
private static readonly Uri thisGuy = new Uri("urn:TestLooperAttribute");
private string _PropertyName;
public string PropertyName
{
get
{ return _PropertyName; }
set
{
_PropertyName = value;
}
}
public override Uri ExtensionId
{
get {
return thisGuy; }
}
public override TestExtensionExecution GetExecution()
{
return new TestLooperExecution(PropertyName);
}
}
接下來,我們必須創建一個自定義測試類執行類:
class TestLooperExecution : TestExtensionExecution
{
private string PropertyName;
public TestLooperExecution(string PropertyName)
{
this.PropertyName = PropertyName;
}
public override ITestMethodInvoker CreateTestMethodInvoker(TestMethodInvokerContext InvokerContext)
{
return new TestLooperInvoker(InvokerContext, PropertyName);
}
public override void Dispose()
{
//TODO: Free, release or reset native resources
}
public override void Initialize(TestExecution Execution)
{
//TODO: Wire up event handlers for test events if needed
}
}
最后我們添加一個自定義調用程序,這是我們執行循環的地方:
class TestLooperInvoker : ITestMethodInvoker
{
private TestMethodInvokerContext m_invokerContext;
private string PropertyName;
public TestLooperInvoker(TestMethodInvokerContext InvokerContext, string PropertyName)
{
m_invokerContext = InvokerContext;
this.PropertyName = PropertyName;
}
public TestMethodInvokerResult Invoke(params object[] args)
{
// Our helper results class to aggregate our test results
HelperTestResults results = new HelperTestResults();
IEnumerable<object> objects = m_invokerContext.TestContext.Properties[PropertyName] as IEnumerable<object>;
foreach (var d in objects)
results.AddTestResult(m_invokerContext.InnerInvoker.Invoke(d), new object[1] { d.GetType().ToString()});
var output = results.GetAllResults();
m_invokerContext.TestContext.WriteLine(output.ExtensionResult.ToString());
return output;
}
}
HelperTestResults類只是為輸出構建字符串,你可以按照你想要的方式處理它,我不想包含那些代碼,因為它只會使這篇文章更長。
將其編譯為DLL,然后您需要將其復制到
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies
您還必須為該類創建一個注冊表項:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\EnterpriseTools\QualityTools\TestTypes\{13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b}\TestTypeExtensions\TestLooperAttribute]
"AttributeProvider"="TestLooper.TestLooperAttribute, TestLooper"
既然你完成了所有這些,你終於可以使用這個類了:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TestLooper;
using System.Collections.Generic;
namespace UnitTestSamples
{
[TestLooper(PropertyName="strings")]
public class UnitTest1
{
public static List<String> strings = new List<String>();
private TestContext testContextInstance;
public TestContext TestContext
{
get
{
return testContextInstance;
}
set
{
testContextInstance = value;
}
}
[ClassInitialize()]
public static void Init(TestContext x)
{
strings.Add("A");
strings.Add("B");
strings.Add("C");
strings.Add("D");
}
[TestInitialize()]
public void TestInit()
{
if (!TestContext.Properties.Contains("strings"))
testContextInstance.Properties.Add("strings", strings);
}
[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "DataDriven1.csv", "DataDriven1#csv", DataAccessMethod.Sequential)]
[DeploymentItem("DataDriven1.csv")]
public void TestMethodStrings(string s)
{
int value1 = Convert.ToInt32(TestContext.DataRow["Col1"]); ;
TestContext.WriteLine(String.Format("{0}:{1}", s, value1));
}
}
}
請注意,我們的測試方法接受來自測試循環器的參數。 我還使用數據驅動測試來展示這一點,以顯示您可以將兩者結合在一起,以在您的數據集中生成大的排列。
[TestMethod()]
public void RepetableTest(){
for(int i = 0; i < repeatNumber; i++){
//test code goes here
}
}
我猜答案是否定的。
考慮創建一個測試來分離幾個線程。 測試列表不允許您為同一測試提供多個條目。 但是,您可以將多線程測試分配給自己的列表,並僅在您要運行該特定測試時調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.