Как рассчитать охват кода селеном тестов по отношению к коду веб-приложения

У меня есть требование зафиксировать охват кода моих тестов selenium на количество исходного кода в коде сервера (исходный код веб-приложения).

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

Еще нужно знать, какой пакет или класс он коснулся кода веб-приложения для сценария. Например, логин

Я не смог найти подходящее решение, хотя я узнал о инструменте покрытия кода Jacoco и попробовал некоторые образцы с использованием плагина Jacoco Jenkins, но успеха нет.

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

Ответ 1

Убедитесь, что вы сделали это. Заметьте, что если вы используете Gradle, Maven или ANT. Но следующая концепция очень похожа на любую систему сборки.

  • У вас должен быть артефакт приложения .war/.ear, который нужно запустить за Tomcat/подобным.
    • Вам также необходимо убедиться, что вы скомпилировали свой основной код в режиме отладки, или jacoco не будет счастлив.
    • Например: опция -g в Java и аналогичная опция отладки (если вы используете groovy).


tasks.withType(Compile) {
    options.debug = true
    options.compilerArgs = ["-g"]
}


  1. Допустим, у вас есть .war и использование Tomcat. Затем при запуске Tomcat.
    • В Tomcat start script убедитесь, что вы сообщаете Tomcat JVM, где файл jacocoagent.jar и передаете другие параметры. ЭТО ГЛАВНЫЙ недостающий пункт когда-то мы видим (ака не присоединяем jacoco к целевому сеансу JVM и пытаемся получить покрытие кода).

Для примера: я запускаю Tomcat script со следующим параметром, переданным Tomcat (-Dxxxx = value way)

PROJ_EXTRA_JVM_OPTS=-javaagent:tomcat/jacocoagent.jar=destfile=build/jacoco/ST/jacocoST.exec,append=false

В принципе, запуск Tomcat script будет иметь значение -Dparameter = value, вы можете передать указанный выше параметр (Linux/Unix export) в область видимости JCM Tomcat/Target.

Вышеприведенная строка параметров при отправке в Tomcat добавит JAR-код агента .jar в "TARGET" (также известный как Tomcat JVM). Здесь вы говорите Tomcat, что ищите файл jacocoagent.jar от директора под названием "tomcat" под вашим рабочим пространством. Он создаст файл jacoco.exec с именем "jacocoST.exec" (aka jacoco exec file для Selenium Test) в папке build/jacoco/ST (я использую Gradle, поэтому Gradle создает папку "build" при каждом запуске build/compile/test/integrationTest/customSeleniumTaskThatYouMightHaveCreated).

ПРИМЕЧАНИЕ. Это означает, что вам не нужно указывать раздел jacoco в тестовой задаче (так как это будет работать в JVM вашей системы BUILD либо Gradle, либо Maven или ANT все, что у вас есть).

//We don't need jacoco for non-unit tests type of tasks as Jacoco won't be able to find any coverage if done this way. Jacoco agent file needs to be attached/visible to the TARGET JVM (where you run your application via a .war / .ear etc).

jacoco { 
  //  ... As Gradle runs Unit tests (while doing build), they run free, in the same JVM where Gradle runs the build so Unit test have visibility to the main classes in the same JVM (which Gradle is using to run the build). Thus, you can use jacoco section in Gradle for running unit tests. BUT,
  // ... Don't use this section for running Integration, Acceptance, Selenium tests which run on a target JVM. Instead attach jacocoagent.jar and specify jacoco parameters to the target JVM.
}
  1. После того, как вы включите Tomcat, теперь вы запускаете тесты Selenium. ЗАМЕТКА: - Я использую Jenkins на Linux/Unix, а плагин "xvfb" очень удобен, т.е. Теперь я могу запускать тесты Selenium GUI в режиме HEADLESS, и я не буду бить любого пользователя на машине, где проходят тесты, страницы тестов во время выполнения графических тестов.

    - если вы в конечном итоге используете плагин xvfb "в Jenkins, вам FIRST нужно запустить сервис" Xvfb "на сервере (Linux/Unix), где вы запускают тесты.

    - Если вы запускаете тесты без модулей (например, Integration/Selenium и т.д.) на компьютере под управлением Windows, вы можете увидеть, что тесты GUI появляются при выполнении ваших тестов. Если вы не хотите видеть всплывающие окна, ваш экземпляр Jenkins может запускать процесс ведомого (ваш Windows) в качестве службы ( "Установить как услугу" ). Если вы создаете свою машину Windows в качестве подчиненного устройства, при запуске установки JLNP на вашем компьютере вы увидите всплывающее окно, в котором Jenkins успешно запустил подчиненный процесс, нажав "Файл" > "Установить", поскольку служба запустит ваш ведомый на машине Windows как "БЕСПЛАТНАЯ".

  2. Пока ваши тесты запущены, вы заметите, что на этот раз jacoco создаст структуру папок/файл exec в соответствии с вашим заданным значением параметра destfile, но все равно будет 0 или небольшого размера.

  3. После завершения тестов Selenium/non-unit вы должны "STOP" Tomcat/target JVM. Это будет FLUSH всю информацию о покрытии jacoco в этом файле jacocoST.exec(пользовательский файл, который вы хотите создать jacoco). - Примечание. Если вы хотите, чтобы файл jacocoST.exec очищался "на лету" (без необходимости остановки JVM/сессии Tomcat, вы можете посмотреть документацию jacoco, как это сделать, есть одна тема, в которой говорится об этом, таким образом ваше приложение может продолжать работать, и вам не нужно останавливать приложение/веб-сервис).

  4. Запустите jacocoTestReport, и вы увидите охват jacoco-кода.

    • Убедитесь, что вы указали, где ваши источники/классы для основного кода.

для ex:

  jacocoTestReport {
      group = "Reporting"
      description = "Generate Jacoco coverage reports after running tests."
      ignoreFailures = true


      //UT=is for Unit tests, IT=integrationTest, AT=acceptanceTest, ST=Selenium GUI tests.
      //executionData = files('build/jacoco/UT/jacocoUT.exec')
      //executionData = files('build/jacoco/IT/jacocoIT.exec')
      //executionData = files('build/jacoco/UT/jacocoUT.exec', 'build/jacoco/IT/jacocoIT.exec')

      //executionData = files(['build/jacoco/UT/jacocoUT.exec', 'build/jacoco/IT/jacocoIT.exec'])
      //OR use the following way for all.
      executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')

      reports {
             xml{
                 enabled true
                 //Following value is a file
                 destination "${buildDir}/reports/jacoco/xml/jacoco.xml"
             }
             csv.enabled false
             html{
                 enabled true
                 //Following value is a folder
                 destination "${buildDir}/reports/jacoco/html"
             }
      }

      //sourceDirectories = files(sourceSets.main.allJava.srcDirs)
      sourceDirectories = files('src/java')
      //sourceDirectories = files(['src/java','src/groovy'])
      classDirectories =  files('build/classes/main')

      //------------------------------------------
      //additionalSourceDirs = files(['test/java','test/groovy','src/java-test', 'src/groovy-test'])
      //additionalSourceDirs += files('src/java-test')
}

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

Ответ 2

Одеяло может работать.

Это библиотека JavaScript.

Вы комментируете импорт на своей HTML-странице с атрибутом "обложка данных":

<script src="sourceScript.js" data-cover></script>

... и одеяло заменяет ваши JS файлы аннотированными копиями, которые сообщают о себе.

Нетривиальный шаг - получить статистику охвата кода с помощью обложки, но если я не ошибаюсь, у Selenium есть интерфейс, который позволяет вам выполнять функции JavaScript в движке браузера. API находится здесь:

https://github.com/alex-seville/blanket/blob/master/docs/advanced_browser.md