Как запустить тестовый метод с несколькими параметрами в MSTest?
NUnit имеет функцию под названием "Значения", как показано ниже:
[Test]
public void MyTest(
[Values(1,2,3)] int x,
[Values("A","B")] string s)
{
// ...
}
Это означает, что метод проверки будет выполняться 6 раз:
MyTest(1, "A")
MyTest(1, "B")
MyTest(2, "A")
MyTest(2, "B")
MyTest(3, "A")
MyTest(3, "B")
Теперь мы используем MSTest, есть ли эквивалент для этого, чтобы я мог запускать один и тот же тест с несколькими параметрами?
[TestMethod]
public void Mytest()
{
// ...
}
Ответы
Ответ 1
К сожалению, он не поддерживается в MSTest. По-видимому, существует модель расширяемости, и вы можете ее реализовать самостоятельно. Другим вариантом было бы использовать тесты, управляемые данными.
Мое личное мнение состояло бы в том, чтобы просто придерживаться NUnit, хотя...
EDIT: с Visual Studio 2012, обновление 1, MSTest имеет аналогичную функцию. См. @McAden ответ ниже.
Ответ 2
EDIT 4: похоже, что это завершено в MSTest V2 17 июня 2016 года: https://blogs.msdn.microsoft.com/visualstudioalm/2016/06/17/taking-the-mstest-framework-forward-with-mstest-v2/
Оригинальный ответ:
Примерно через неделю в Visual Studio 2012 Update 1 теперь возможно что-то подобное:
[DataTestMethod]
[DataRow(12,3,4)]
[DataRow(12,2,6)]
[DataRow(12,4,3)]
public void DivideTest(int n, int d, int q)
{
Assert.AreEqual( q, n / d );
}
EDIT. Похоже, это доступно только в рамках проекта тестирования модулей для WinRT/Metro. Лентяй
EDIT 2. Ниже приведены метаданные, найденные с использованием "Перейти к определению" в Visual Studio:
#region Assembly Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll, v11.0.0.0
// C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\MSTestFramework\11.0\References\CommonConfiguration\neutral\Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll
#endregion
using System;
namespace Microsoft.VisualStudio.TestPlatform.UnitTestFramework
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class DataTestMethodAttribute : TestMethodAttribute
{
public DataTestMethodAttribute();
public override TestResult[] Execute(ITestMethod testMethod);
}
}
EDIT 3. Эта проблема возникла на форумах Visual Studio UserVoice.
Последнее обновление:
НАЧАЛО РАБОТЫ · Команда Visual Studio Команда ADMIN Visual Studio (продукт Team, Microsoft Visual Studio) ответили · 25 апреля 2016 г. Спасибо для обратной связи. Мы начали работать над этим.
Pratap Lakshman Visual Studio
https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/3865310-allow-use-of-datatestmethod-datarow-in-all-unit
Ответ 3
Эта функция теперь находится в предварительная версия и работает с VS 2015.
Например:
[TestClass]
public class UnitTest1
{
[DataTestMethod]
[DataRow(1, 2, 2)]
[DataRow(2, 3, 5)]
[DataRow(3, 5, 8)]
public void AdditionTest(int a, int b, int result)
{
Assert.AreEqual(result, a + b);
}
}
Ответ 4
Поскольку никто не упоминается - не совсем то же самое, что и атрибуты NUnit Value
(или TestCase
), но MSTest имеет атрибут DataSource
, что позволяет вам делать подобное. Вы можете подключить его к базе данных или XML файлу - не так просто, как функция NUnit, но выполняет задание.
Ответ 5
MSTest имеет мощный атрибут DataSource, с помощью которого вы можете выполнить проверку данных, как вы просили. Вы можете иметь свои тестовые данные в XML, CSV или в базе данных. Вот несколько ссылок, которые помогут вам
http://visualstudiomagazine.com/articles/2009/09/15/unit-testing-with-vsts2008-part-3.aspx
http://msdn.microsoft.com/en-us/library/ms182527.aspx
http://msdn.microsoft.com/en-us/library/ms243192.aspx
Надеюсь, это поможет вам.
Ответ 6
MsTest не поддерживает эту функцию, но вы можете реализовать свой собственный атрибут для достижения этого.
посмотрите ниже:
http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html
Ответ 7
Существует, конечно, еще один способ сделать это, который не обсуждался в этом потоке, то есть путем наследования класса, содержащего TestMethod. В следующем примере был определен только один TestMethod, но были сделаны два тестовых примера.
В Visual Studio 2012 он создает два теста в TestExplorer:
- DemoTest_B10_A5.test
-
DemoTest_A12_B4.test
public class Demo
{
int a, b;
public Demo(int _a, int _b)
{
this.a = _a;
this.b = _b;
}
public int Sum()
{
return this.a + this.b;
}
}
public abstract class DemoTestBase
{
Demo objUnderTest;
int expectedSum;
public DemoTestBase(int _a, int _b, int _expectedSum)
{
objUnderTest = new Demo(_a, _b);
this.expectedSum = _expectedSum;
}
[TestMethod]
public void test()
{
Assert.AreEqual(this.expectedSum, this.objUnderTest.Sum());
}
}
[TestClass]
public class DemoTest_A12_B4 : DemoTestBase
{
public DemoTest_A12_B4() : base(12, 4, 16) { }
}
public abstract class DemoTest_B10_Base : DemoTestBase
{
public DemoTest_B10_Base(int _a) : base(_a, 10, _a + 10) { }
}
[TestClass]
public class DemoTest_B10_A5 : DemoTest_B10_Base
{
public DemoTest_B10_A5() : base(5) { }
}
Ответ 8
Это очень просто реализовать - вы должны использовать свойство TestContext
и TestPropertyAttribute
.
Пример
public TestContext TestContext { get; set; }
private List<string> GetProperties()
{
return TestContext.Properties
.Cast<KeyValuePair<string, object>>()
.Where(_ => _.Key.StartsWith("par"))
.Select(_ => _.Value as string)
.ToList();
}
//usage
[TestMethod]
[TestProperty("par1", "http://getbootstrap.com/components/")]
[TestProperty("par2", "http://www.wsj.com/europe")]
public void SomeTest()
{
var pars = GetProperties();
//...
}
Ответ 9
Я не мог заставить The DataRowAttribute
работать в Visual Studio 2015, вот что я закончил:
[TestClass]
public class Tests
{
private Foo _toTest;
[TestInitialize]
public void Setup()
{
this._toTest = new Foo();
}
[TestMethod]
public void ATest()
{
this.Perform_ATest(1, 1, 2);
this.Setup();
this.Perform_ATest(100, 200, 300);
this.Setup();
this.Perform_ATest(817001, 212, 817213);
this.Setup();
}
private void Perform_ATest(int a, int b, int expected)
{
//Obviously this would be way more complex...
Assert.IsTrue(this._toTest.Add(a,b) == expected);
}
}
public class Foo
{
public int Add(int a, int b)
{
return a + b;
}
}
Реальное решение здесь - просто использовать NUnit (если вы не застряли в MSTest, как я в этом конкретном случае).
Ответ 10
Вы можете реализовать тест, управляемый данными, например ЗДЕСЬ. Я не знаю, есть ли такие удобные
как в NUnit..