Моя проблема в том, что у меня есть куча методов тестирования, управляемых данными, использующих среду тестирования MSTest.Каждый из этих управляемых данными методов использует одни и те же тестовые данные для создания экземпляра объекта.Вместо того, чтобы создавать экземпляры одного и того же объекта в каждом отдельном методе тестирования, а вместо данных, управляющих каждым отдельным методом тестирования с одними и теми же данными, я хочу использовать эти тестовые данные один раз для класса и создавать экземпляр этого объекта для каждого отдельного метода тестирования.Но я не уверен, возможно ли это?
Вот пример того, как я выполняю желаемое поведение, используя NUnit:
namespace Web.Tests.BestPractices
{
[TestFixture]
[TestFixtureSource(typeof(CrossBrowserData), "LatestConfigurations")]
[Parallelizable]
public class LoginFeature : BaseTest
{
private SauceDemoLoginPage _loginPage;
public LoginFeature(string browser, string version, string os) :
base(browser, version, os)
{
}
[Test]
public void LoginPageShouldLoad()
{
_loginPage.Open().IsLoaded.Should().BeTrue("the login page should load successfully.");
}
В конечном итоге, [TestFixtureSource(typeof(CrossBrowserData), "LatestConfigurations")]
указывает на класс, которыйесть все мои тестовые данные.Эти данные используются для обработки данных каждого отдельного метода тестирования, например:
[TestFixture]
public class BaseTest
{
[SetUp]
public void ExecuteBeforeEveryTestMethod()
{
var sauceConfig = new SauceLabsCapabilities {IsDebuggingEnabled = true};
SauceLabsCapabilities.BuildName = _sauceBuildName;
Driver = new WebDriverFactory(sauceConfig).CreateSauceDriver(_browser, _browserVersion, _osPlatform);
SauceReporter = new SauceJavaScriptExecutor(Driver);
SauceReporter.SetTestName(TestContext.CurrentContext.Test.Name);
SauceReporter.SetBuildName("BestPracticesTests5");
_isUsingSauceLabs = true;
}
private readonly string _browser;
private readonly string _browserVersion;
private readonly string _osPlatform;
public BaseTest(string browser, string browserVersion, string osPlatform)
{
_browser = browser;
_browserVersion = browserVersion;
_osPlatform = osPlatform;
}
. В результате у меня есть несколько методов тестирования, которые работают с комбинациями из 3 параметров, которые передаются в BaseTest.cs.Конструктор public BaseTest(string browser, string browserVersion, string osPlatform)
Я не могу эмулировать то же самое в MSTest, поскольку кажется, что [DynamicData]
применяется только на уровне метода.
Кроме того, другая проблема заключается в том, что мне нужно создать экземпляр этого объекта Driver = new WebDriverFactory(sauceConfig).CreateSauceDriver(_browser, _browserVersion, _osPlatform);
в [TestInitialize], аналогично тому, как я делаю это в NUnit:
public class BaseTest
{
[SetUp]
public void ExecuteBeforeEveryTestMethod()
{
Driver = new WebDriverFactory(sauceConfig).CreateSauceDriver(_browser, _browserVersion, _osPlatform);
//other unimportant code...
}
Но всекажется, что данные теста могут быть получены только на уровне [TestMethod]
.Так что мне кажется невозможным сделать [TestInitialize]
раньше?
И кажется, что единственный способ сделать это сейчас - это сделать так?Или есть более эффективный способ?
[TestMethod]
[DynamicData("LatestConfigurations", typeof(MsTestCrossBrowserData),
DynamicDataDisplayName = "GetCustomDynamicDataDisplayName",
DynamicDataDisplayNameDeclaringType = typeof(MsTestCrossBrowserData))]
public void SeleniumTest1(string browser, string version, string osVersion)
{
Driver = new WebDriverFactory(sauceConfig).CreateSauceDriver(_browser, _browserVersion, _osPlatform);
SimpleTest(MethodBase.GetCurrentMethod().Name);
}