2016-04-12 1 views
1

Чтобы получить более подробную информацию, у нас есть серия тестов, которые мы хотим дублировать в трех рамках (с использованием Selenium для стимуляции пользовательского интерфейса): IE, Mozilla и Chrome. Первым решением было дублирование тестов в отдельных тестовых классах, т. Е. Каждый тестовый класс имел те же 20 тестовых примеров с другой структурой в конструкторе. Второе решение заключается в использовании параметризованных входов (или теории XUnit) с каждым типом каркаса в качестве входного сигнала:Как использовать автоматические интеграционные тесты для нескольких фреймворков (интернет-браузеров) без дублирования усилий?

/// <summary> 
    /// The non-default constructor that initializes 
    /// necessary instances of objects that are being used 
    /// </summary> 
    public VerifyViewUsingChrome() { 
     _testBases = new Dictionary<FunctionalTestBase.DriverType, TestBase>(); 
     _testBases.Add(FunctionalTestBase.DriverType.Chrome, new TestBase(FunctionalTestBase.DriverType.Chrome)); 
     _testBases.Add(FunctionalTestBase.DriverType.IE, new TestBase(FunctionalTestBase.DriverType.IE)); 
     _testBases.Add(FunctionalTestBase.DriverType.FireFox, new TestBase(FunctionalTestBase.DriverType.FireFox)); 
    } 


    /// <summary> 
    /// Our simple country display test. 
    /// </summary> 
    [InlineData(FunctionalTestBase.DriverType.Chrome)] 
    [InlineData(FunctionalTestBase.DriverType.FireFox)] 
    [InlineData(FunctionalTestBase.DriverType.IE)] 
    [Theory] 
    public void TestADisplayedForACountry(FunctionalTestBase.DriverType testBase) { 
     _testBases[testBase].TestADisplayedForACountry(); 
    } 

проблемы с этой реализацией является то, что все 3 реализаций должны быть запущены для каждого теста, который требует некоторых накладные расходы. В идеале мы будем запускать все тесты IE, а затем создавать фреймворк Firefox и запускать эти тесты, прежде чем продолжить работу с Chrome.

Это может быть невозможно с помощью тестовой среды, но для нас есть удобные связки с нашим сервером сборки, поэтому сохранение формата теста было бы идеальным.

+1

Вы используете Selenium? – trailmax

+0

Да. Именно так мы стимулируем пользовательский интерфейс. –

+1

Возможно, это должно было быть упомянуто в вопросе или тегах. Но теперь нет пота - вы нашли решение, которое вам подходит. – trailmax

ответ

1

Я только понял, что решение было проще, чем я думал. Конструктор вызывается перед каждым тестом, поэтому запуск и разрыв структуры происходит независимо от того, как выполняются тесты (что имеет смысл, так как вы не хотите, чтобы из предыдущих тестов не было кровотока).

Вот что мы решили сделать:

/// <summary> 
    /// The non-default constructor that initializes 
    /// necessary instances of objects that are being used 
    /// </summary> 
    public VerifyViewUsing() { } 


    /// <summary> 
    /// Our simple country display test. 
    /// </summary> 
    [InlineData(FunctionalTestBase.DriverType.Chrome)] 
    [InlineData(FunctionalTestBase.DriverType.FireFox)] 
    [InlineData(FunctionalTestBase.DriverType.IE)] 
    [Theory] 
    public void TestADisplayedForACountry(FunctionalTestBase.DriverType testBaseType) { 
     TestBase testBase = new TestBase(testBaseType); 
     testBase.TestADisplayedForACountry(); 
    } 

Эта функция в значительной степени точно, как мы хотели, чтобы он. Каждый тест независим, дублируется в рамках фреймворков и запускается с результатами, связанными с используемой структурой.

Edit: фактический метод лучше бы это:

public static IEnumerable<object[]> DriverTypes { 
     get { 
      // Or this could read from a file. :) 
      return new[] 
      { 
       new object[] { FunctionalTestBase.DriverType.Chrome }, 
       new object[] { FunctionalTestBase.DriverType.IE}, 
       new object[] { FunctionalTestBase.DriverType.FireFox} 
      }; 
     } 
    } 
    /// <summary> 
    /// Verifies that Brucellosis is displayed in the Disease List for 
    /// Zimbabwe 
    /// </summary> 
    [Theory, MemberData("DriverTypes")] 
    public void TestClickingADiseaseLinkDisplaysACreatePage(FunctionalTestBase.DriverType testBaseType) { 
     TestBase testBase = new TestBase(testBaseType); 
     testBase.TestClickingADiseaseLinkDisplaysACreatePage(); 
    } 

Это позволяет определить ваши рамки один раз, и использовать их по проекту.

Смежные вопросы