Можно ли управлять методами MSTest данных на уровне класса, а не на уровне метода? - PullRequest
0 голосов
/ 31 января 2019

Моя проблема в том, что у меня есть куча методов тестирования, управляемых данными, использующих среду тестирования 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);
        }
...