ProtractorJS_как сделать так, что бы в тестах тест-дата брались из txt/json каждый раз новые?

Добрый день!

Заранее прошу прощения за то, если напишу что-то невнятное. Я новичок в автотестах. Сейчас пишу в ProtractorJS+Jasmine. Проблема в том, что для каждого прогона всех тестов должны браться новые тест-дата: Фамилия, имя, отчество, почта, пол, другие данные, общей численностью 30 шт. Вручную их все заносить как-бы не разумно. Подскажите, пожалуйста, какие использовать команды для этого? Требуется что бы тест каждый раз подгружал новый “пакет” данных из файла txt/json (или любой другой), при этом не использовал (или удалял) ранее использованный. По достижению конца в файле тест-дата, выводилось соответствующее сообщение. Используемые языки: JS, nodeJS.

P.S.: БД чистить не предоставляется возможным в виду специфичности продукта.

1 лайк

@xotabu4 прийди и помоги человеку =)

Доберусь до компа и отвечу :slight_smile:

Есть чудесная библиотека на js генератор фейковых данных http://chancejs.com/, можно создавать свои mixin’ы на любой вкус.

Хм, интересная штука! Благодарю! Только сомневаюсь что она мне поможет. В моем продукте на фронте есть проверки каждого поля на валидность (спец. символы, укр алфавит, формулы ИНН). Просто так от балды не прокатит.

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

Почему это не поможет, эта штука поддерживает создание своих собственных данных на основе их методов, называется mixin. Вы можете сами формировать данные по вашим правилам, рекомендую внимательнее ознакомится с этой библиотекой. вот как примерно выглядит:

var chance = require('chance').Chance();
// generate random user
chance.mixin({
    'customer': function() {
        return {
            title: chance.pick(['Mr', 'Ms']),
            first: chance.first(),
            last: chance.last(),
            name: function () {
               return this.first + ' ' + this.last
            },
            email: chance.email(),
            birthday: moment(chance.birthday()).format('DD.MM.YYYY'),
            country: chance.pick([// your countries]),
            inn: //your function-generator for inn,
        };
    }
});

// then use it in tests
describe('User', function () {  
    it('should register new user', function () {
        var customer = chance.customer();
        ......
     })
});

1 лайк

Привет!

У меня еще была потребность запускать мои тракторные тесты многопоточно, потому я дополнительно перед тестами стартовал маленький nodejs сервер который по http отдавал юзера, и принимал назад когда он уже не нужен. Если у тебя тесты в один поток тебе это не нужно. Попробуй воспользоватся функциями beforeEach и afterEach, и доставать юзера перед тестами. Простейший пример, я не переусложнял, чисто чтобы описать суть -

Сам json файл может выглядеть как угодно, вот пример:

{
  "users": [
    {"login": "test", "password": "123456"},
    {"login": "test1", "password": "123456"},
    {"login": "test2", "password": "123456"},
    {"login": "test3", "password": "123456"},
    {"login": "test4", "password": "123456"},
    {"login": "test5", "password": "123456"}
    ]
}

В файле конфигурации протрактора:

module.exports.config = {
    // остальная конфигурация...

    onPrepare: function () {
        //читаем и парсим json файл
        let users = require('./test.json').users
        console.log(users)

        beforeEach(()=> {
            //перед каждым тестом вытаскиваем свежего юзера из списка
            let user = users.pop()
            console.log('Got user:', user)
            browser.params.login = user.login;
            browser.params.password = user.password;
        })
    }
}

Дальше в самом тесте все мега просто, когда вы делаете логин - берите параметры из browser.params:

describe('Suite name', ()=> {

    it('Test name', ()=> {
        new LoginPage().login(browser.params.login, browser.params.password)
    })

    it('Test name1', ()=> {
        new LoginPage().login(browser.params.login, browser.params.password)
    })

    it('Test name2', ()=> {
        new LoginPage().login(browser.params.login, browser.params.password)
    })
})

Если хочется это использовать - обязательно нужно обрабатывать ситуацию когда .pop() уже выбрал всех юзеров, и если используется паралелизация - то это не сработает - каждый поток будет читать файл отдельно от остальных.

Почитать:

1 лайк

Ну и мой пример можно легко скомбинировать с библиотекой которую предложил @Valentin_Buryakov

1 лайк

Благодарю! Буду пробовать!

А почему не использовать var name = partOfNameFromJSON + Date.now()?
Можно пробегаться по JSON брать первое имя => добавлять дату => использовать в тесте => переходим ко второмуб снова берем, снова добавляем дату, снова юзаем в тестах. Т.к. дата в милисекундах каждый раз будет новое значение.

Это, если нам таки нужны хоть какие-то данные из json файла.
А если нет, тогда еще проще var name = ‘AutomationTestPersonName’ + Date.now();

Все зависит от того, какую задачу вы хотите решить с помощью json файла?