Автоматическое обнаружение тестовой связи в Protractor (случайный порядок выполнения тестов)

Проблема:

У нас довольно большая тестовая кодовая база. Время от времени, вместо того, чтобы выполнять все тесты, мы выполняем их по отдельности или пакетами. Но иногда мы видим неожиданные сбои тестов из-за того, что тесты взаимосвязаны, связаны. Например, в одном тесте предполагается, что существуют некоторые данные, созданные предыдущим тестом, — выполнение такого теста по отдельности не удастся.

Вопрос:

Можно ли автоматически определить, какие тесты Protractor связаны в проекте?

Наша текущая идея состоит в том, чтобы каким-то образом рандомизировать порядок выполнения тестов или случайным образом выбрать пакет тестов из всех доступных тестов и проверить, нет ли сбоев. Следовательно, другой вопрос: возможно ли изменить/рандомизировать обнаружение теста Protractor и изменить порядок выполнения теста?


Вдохновленный записью в блоге Неда Батчелдера "Поиск связанности тестов" и < href="https://pypi.python.org/pypi/nose-randomly" rel="nofollow noreferrer">nose-randomly плагин:

Случайность в тестировании может быть достаточно мощной, чтобы обнаружить скрытые недостатки в самих тестах, а также дать немного больше охвата вашей системы.

Случайный порядок тестов снижает риск неожиданных зависимостей между тестами — метод, используемый во многих местах, например, в средстве запуска тестов C++ от Google googletest.


person alecxe    schedule 25.12.2016    source источник
comment
Рассматривали ли вы возможность создания необходимых данных в настройках тестов? это удалит зависимость в других тестах.   -  person Guy    schedule 25.12.2016
comment
@Парень, да, в идеале тесты должны быть независимы друг от друга, должным образом настроены и очищены, но, к сожалению, у нас уже есть эта проблема. Кроме того, если есть способ рандомизировать порядок выполнения тестов, это будет большим преимуществом для нас в будущем. У нас будет это как своего рода тест изоляции для нашего теста. Спасибо.   -  person alecxe    schedule 25.12.2016


Ответы (3)


Вы можете запускать тесты случайным образом (на уровне файлов), установив свойство random в ваша конфигурация . Вы также можете установить свою соль / семя, чтобы она была воспроизводимо случайной.

/**
 * If true, run specs in semi-random order
 */
random?: boolean,
/**
 * Set the randomization seed if randomization is turned on
 */
seed?: string,

Вы также можете включить shardTestFiles (параллельные тестовые прогоны), что также должно очень сильно сказать о том, насколько связаны ваши тесты.

person Brine    schedule 25.12.2016
comment
Звучит очень близко к решению части проблемы с рандомизацией! Спасибо. Однако запуск тестов в случайных блоках (не всех тестов, а случайных частей) — открытая проблема. - person alecxe; 25.12.2016
comment
Кажется, что эта рандомизация тестовых блоков должна быть выполнима... возможно, на уровне тестировщика. Так что, может быть, жасмин или мокко. Хммм... Я стараюсь всегда запускать свои новые тесты или тесты, которые я исправляю, запускать каждый тест изолированно. На самом деле я только что развязал тест сегодня... добавив блок очистки afterEach. Это может показаться трудоемким... но точно не больше времени, чем отладка всего тестового прогона :) - person Brine; 06.01.2017
comment
Да, я понимаю теорию тестовых установок и демонтажа, здесь я попытался получить больше перспективы: хорошо, у нас уже есть связанные тесты, теперь, поскольку тестов много, есть ли способ найти группы уже связанных тестов. Затем, в качестве бонуса, тот же механизм можно применить для случайного запуска тестов в будущем, что поможет поддерживать изолированные тесты. Я думаю, что флаг random является решением этой проблемы. Другая часть является бонусом и может быть запрограммирована путем динамической подготовки спецификаций или наборов внутри конфигурации транспортира. Спасибо еще раз! - person alecxe; 06.01.2017
comment
Да, я с тобой. Не хотел показаться лектором... Я просто расширил свой ответ (и немного бессвязно :)). Мое намерение было бы яснее, если бы я также добавил ... но иметь способ помочь обнаружить эти связи, безусловно, было бы еще лучше. Алекс, отличный вопрос... и я нарыл ссылку на статью. Спасибо за публикацию. - person Brine; 07.01.2017

Пробовали ли вы перетасовывать блоки «it», как показано ниже:

var shuffle = function (items) {
  var item, randomIndex;      
  for(var i = 0; i < items.length; i++){
    randomIndex= (Math.random() * items.length) | 0;
    item = items[i];
    items[i] = items[randomIndex];
    items[randomIndex] = item;
  }
}

describe('Suite', function() {

  it("should a", function () {
      console.log("execute a");
  });

  it("should b", function () {
      console.log("execute b");
  });

  it("should c", function () {
      console.log("execute c");
  });

  shuffle(this.children);    // shuffle the 'it' blocks

});

Источник: Можно ли запускать тесты транспортира в случайном порядке?

person Vishal Aggarwal    schedule 02.01.2017

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

Моей первой мыслью было просто запустить их по отдельности и посмотреть, какие из них не работают. Проблема в том, что если вы не очищаете состояние между тестами, вы можете изменить порядок (рандомизируя их, как вы предложили), но если тест 50 ожидает данные, настроенные тестом 20, но в новом порядке, тест 20 все еще выполняется до тест 50... тест 50 все равно пройдет. Вы найдете некоторые, но, вероятно, не все, пока не запустите их все в случайном порядке несколько раз.

Вы не описываете свое приложение, но моя вторая мысль заключалась в том, что если бы был способ вернуться к чистому листу между тестами, вы должны были бы найти тесты, которые полагаются на другие тесты для настройки данных. Я немного удивлен, что вы еще этого не делаете, но если есть длительный процесс установки, который необходимо выполнить для установки с чистого листа и т. д., это может быть проблемой. В зависимости от вашей системы вы можете сделать снимок виртуальной машины после чистой установки и восстановить ее, чтобы «быстро» вернуться к чистой, или вы можете откатить таблицы SQL и т. Д. Это действительно зависит от вашей системы и без более подробности о системе, трудно дать совет.

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


О... Я только что подумал еще об одном. Если бы вы могли обратить порядок выполнения тестов, это было бы лучше, чем случайное выполнение. В обратном порядке НИКАКОЙ тест не будет запускаться после своего предыдущего предшественника, и вы сможете найти их все за один раз.

person JeffC    schedule 25.12.2016
comment
А вообще советы хорошие, спасибо! Обратный порядок — хорошая идея, он не поймает все связанные тесты, но может точно выявить некоторые из них. Мне пришлось задать общий вопрос, поскольку взаимосвязи между тестами сильно различаются, и они в значительной степени зависят от приложения. В основном здесь я пытаюсь понять, как мы можем рандомизировать порядок выполнения транспортира, но дело не только в порядке. В идеале мы хотели бы также выбрать случайные образцы, блок тестов и запустить их отдельно. Все это должно повысить/проверить ценность и качество наших тестов. - person alecxe; 25.12.2016