Подтвердить что ты не робот

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

Проблема:

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

Вопрос:

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

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


Вдохновленный Ned Batchelder "Поиск тестовой связи" blogpost и тестовый бегун Python nose nose-randomly плагин:

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

Случайно упорядочивая тесты, риск неожиданного интер-теста сокращается зависимость - метод, используемый во многих местах, например Googles С++ test runner googletest.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы пытались перетасовать "это", как показано ниже:

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

});

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

Ответ 3

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

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

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

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


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