Параметризованное тестирование с помощью Nightwatch (тестирование на основе данных)

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

Я использовал в TestNG вот так:

package parameters;
import org.testng.annotations.Parameters;
// [...] 
@Test
@Parameters({"param1","param2"})
public void testParameter(String param1, String param2)
// [..]

для чтения из testng.xml, который содержит тестовую конфигурацию:

<suite name="Smoke Test" thread-count="1">
  <parameter name = "productName" value = "Bonbons" />
  <parameter name = "productID" value = "09464703" />
  <test name = "ProductInfo">
    <classes>
      <class name = "parameters.testParameter">
      </class>
    </classes>
  </test>
</suite>

Есть ли какая-нибудь пользовательская библиотека javascript, которая поможет с этим в Nightwatch? или, может быть, есть способ интегрировать его с каким-то другим инструментом? (Насколько мне известно, Nightwatch построен на основе Node.Js, который также не поддерживает тестирование на основе данных, но для достижения этой цели он интегрируется с другими инструментами.)


person anasarbescu    schedule 11.12.2015    source источник


Ответы (2)


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

Мне нужны были все тесты, готовые к использованию рабочих процессов nightwatches для одновременного запуска примерно 20 браузеров. У меня было 4 среды, каждая с 4 сайтами, каждая с 4 типами входа, каждая с 4 типами оплаты, каждая с 4 типами карт на 1024 теста для проверки каждой комбинации.

Я не говорю, что это самое простое решение. Именно так я сделал это, чтобы рабочие процессы могли работать со многими средами, и, возможно, измененная версия может быть вам полезна:

var config = require("../globals").config;
var _ = require('underscore');
var fs = require('fs');

var template = fs.readFileSync('testTemplate.js');

_.each(config.environments, function (env) {
    _.each(config.sites, function (site) {
        _.each(config.logins, function (login) {
            _.each(config.paymentTypes, function (paymentType) {
                _.each(config.cardTypes, function (cardType) {

    var testName = env.name+'-'+site.name+'-'+login.name+'-'+paymentType.name+'-'+cardType.name;

    var s = "var _ = require('underscore');\n\n";
    s += "var env = '" + env.name + "';\n";
    s += "var site = '" + site.name + "';\n";
    s += "var login = '" + login.name + "';\n";
    s += "var paymentType = '" + paymentType.name + "';\n";
    s += "var cardType = '" + cardType.name + "';\n\n";
    s += "module.exports = {\n";
    s += "\t'@tags': ['"+env.name+"','"+site.name+"','"+login.name+"','"+adultType.name+"','"+paymentType.name+"','"+cardType.name+"'],\n";
    s += "\t'"+testName+"' : function (browser) {\n";
    s += template;

    fs.writeFile('./tests/'+env.name+'-'+login.name+'/'+testName+'.js', s, function (err) {
      if (err) return console.log(err);
      console.log('s > '+env.name+'/'+testName+'.js');
    });

                });
            });
        });
    });
});

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

Таким образом, в основном вы загружаете данные, которые вам нужны в узле, конвертируете их в формат, который ваши тесты легко поймут (...JS, JSON), создаете все необходимые тесты и запускаете их, либо устанавливая теги, либо запуская тестовые папки со всеми созданные в них тесты.

person curtwphillips    schedule 18.12.2015

Я решил проблему, предоставив вспомогательный класс, который вы можете использовать следующим образом:

  1. Установите модуль nightwatch-data-driven:

    npm i, управляемый данными ночного дозора

  2. Импортируйте класс DataDrivenTest в тестовый модуль:

    import DataDrivenTest from 'nightwatch-data-driven'

  3. Используйте класс следующим образом:

    // . Initialize DataDrivenTest with browser and AAA function
    //   and call it for a set of test cases
    new DataDrivenTest(browser, function(data, name){
        // . Arrange
        browser.logout();
        // . Act
        browser.page.login().loginAndWaitForRedirect(data.email, data.pass);
        // . Assert
        browser.page.workspace().assertIsCurrentPage(name);
    })
    .forCases({
        "Valid credentials": {email: authConfig.main.EMAIL, pass: authConfig.main.PASS},
        "Ignore leading space in email": {email: ' ' + authConfig.main.EMAIL, pass: authConfig.main.PASS},
        "Email in upper case": {
            email: authConfig.main.EMAIL.toUpperCase(),
            pass: authConfig.main.PASS,
            disabled: true
        }
    });
    

Ссылка на репозиторий Github

person wsbaser    schedule 06.04.2016
comment
красивый! похоже, это хорошее решение, постараюсь адаптировать его к своим тестам! Спасибо! - person anasarbescu; 07.04.2016