Nano Hash - криптовалюты, майнинг, программирование

Расширение класса Junit ParentRunner для фильтрации методов тестирования

У меня есть требование прочитать текстовый файл, который содержит список всех тестовых методов со значением «да/нет», и выбрать тестовые методы с пометкой «да» только для класса TestCase и выполнить их в Junit.

Поэтому я написал скрипт для чтения файла и его группировки в map‹ TestCaseName,ArrayList_ofEnabledTestMethods > . Чтобы запустить это, я нашел один вариант — использовать Assume.assumeTrue().

Но я хотел попробовать что-то другое... вместо того, чтобы писать дополнительные строки перед каждым тестовым методом, поэтому я попытался написать собственный бегун (ABCSuite, который расширяет ParentRunner) и планировал чтобы использовать его в моем файле TestSuite, как показано ниже:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(ABCSuite.class)
@Suite.SuiteClasses({TestCalc.class})
public class BatTest{

}

Здесь TestCalc.class содержит все методы тестирования, некоторые из которых помечены как «да» в ранее упомянутом текстовом файле.

Пожалуйста, дайте мне знать, как я могу использовать расширение класса ParentRunner/библиотек Junit для достижения этой цели. Если есть какой-либо хороший учебник или какая-либо ссылка, которая касалась этого раньше, пожалуйста, поделитесь

09.08.2012

  • Является ли ваш список тестовых методов именами методов (test1) или списком имен классов + имен методов (com.mycompany.foo.MyClass#test1)? 10.08.2012
  • На карте ‹TestCaseName,ArrayList_ofEnabledTestMethods › 10.08.2012
  • @Matthew Пожалуйста, проигнорируйте мой предыдущий комментарий... ниже ответ на ваше сообщение... На карте TestCaseName,ArrayList_ofEnabledTestMethodsArrayList_ofEnabledTestMethods состоит только из имен тестовых методов например test1 .. (не имя класса + имена методов) 10.08.2012

Ответы:


1

Вы можете сделать это, расширив BlockJUnit4ClassRunner< /а>:

public class FilterRunner extends BlockJUnit4ClassRunner {
  private List<String> testsToRun = Arrays.asList(new String[] { "test1" });

  public FilterRunner(Class<?> klass) throws InitializationError {
    super(klass);
  }

  @Override
  protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
    Description description= describeChild(method);
    if (method.getAnnotation(Ignore.class) != null || !testsToRun.contains(method.getName())) {
      notifier.fireTestIgnored(description);
    } else {
      runLeaf(methodBlock(method), description, notifier);
    }
  }
}

Вы можете заполнить testsToRun по своему усмотрению. Приведенное выше пометит другие тесты как игнорируемые. Вы используете это как:

@RunWith(Suite.class)
@SuiteClasses({Class1Test.class})
public class TestSuite {
}

@RunWith(FilterRunner.class)
public class Class1Test {
  @Test
  public void test1() {
    System.out.println("test1");
  }

  @Test
  public void test2() {
    System.out.println("test2");
  }
}

Это дает следующий результат:

test1

Если вы не хотите добавлять @FilterRunner в каждый тестовый класс, посмотрите мой ответ на Как определить Правило метода JUnit в наборе?.

10.08.2012
  • Мэтью ... Спасибо за вклад ... но я хочу запускать FilterRunner не для каждого тестового класса, а для уровня набора, так что ваше выше [ссылка] правило метода JUnit в наборе? Я попробовал и обнаружил, что он ожидает тестовый метод в самом наборе, и он запускает только его с данным примером (который расширяет BlockJUnit4ClassRunner), я немного изменил набор тестов, добавив в него метод @Test, иначе он выдавал ошибку инициализации 11.08.2012
  • не могли бы вы сообщить мне, как ваше решение... @FilterRunner будет применимо ко всему набору, в который он включает.... больше, чем один тестовый класс, у которого есть много тестовых методов... и те, которые нужно запускать выборочно (пример **map‹ TestCaseName,ArrayList_ofEnabledTestMethods › **)... 11.08.2012

  • 2

    JUnit реализует это как реализацию Filter. Он должен быть создан с помощью Runner, реализующего Фильтруется. Фильтры применяются рекурсивно через дерево тестов. Таким образом, вам нужно применить этот фильтр только один раз в базовом пакете.

    Вам нужно расширить бегун и в конструкторе применить фильтр. Чтобы сделать вещи более гибкими, вы можете настроить фильтры, которые должны применяться к аннотациям.

    У меня было такое же требование, и это сработало хорошо.

    13.02.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..