web-dev-qa-db-ja.com

Webアプリケーションコードに関するSeleniumテストのコードカバレッジを計算する方法

Seleniumテストのコードカバレッジを、対象となるサーバーコード(Webアプリケーションのソースコード)のソースコードの量までキャプチャする必要があります。

たとえば、ログイン機能のテストでは、ログイン機能のWebアプリケーションでカバーされるコードの量をキャプチャする必要があります。

それ以外の場合は、完了したシナリオのWebアプリケーションコードで、どのパッケージまたはクラスが変更されたかを知る必要があります。例えばログイン

Jacocoコードカバレッジツールについて知り、Jacoco Jenkinsプラグインを使用していくつかのサンプルを試しましたが、適切な解決策が見つかりませんでしたが、成功しませんでした。

私はその可能性を知りません。これを達成する方法についての提案を提供してください、事前に感謝します

26
Vigneshwaran

これを必ず実行してください。 Gradle、Maven、またはANTを使用しているかどうかを確認してください。しかし、次の概念はどのビルドシステムにも非常に似ています。

  1. Tomcatなどの背後で実行する必要がある.war/.earアプリアーティファクトが必要です。
    • また、メインコードをデバッグモードでコンパイルしたことを確認する必要があります。そうしないと、jacocoは満足できません。
    • 例:Javaの-gオプションおよび同様のデバッグオプション(groovyを使用している場合))。


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


  1. .warがあり、Tomcatを使用しているとしましょう。その後、Tomcatを起動します。
    • Tomcat起動スクリプトで、jacocoagent.jarファイルの場所をTomcatのJVMに通知し、他のパラメーターを渡していることを確認します。これは、いつか目にする主な欠落点です(別名jacocoをターゲットJVMのセッションに接続せず、コードカバレッジを取得しようとします)。

例:Tomcatスクリプトを開始し、次のパラメーターをTomcatに渡します(-Dxxxx = value way)

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

基本的に、Tomcat起動スクリプトには-Dparameter = valueがあり、上記のパラメーター(Linux/Unix export変数)をTomcat/Target JVMのスコープに渡すことができます。

上記のパラメーター行をTomcatに送信すると、JACOCOエージェントの.jarファイルが「TARGET」(別名Tomcat JVM)に添付されます。ここでは、Tomcatに対して、ワークスペースの下にある「Tomcat」というディレクタからjacocoagent.jarファイルを探すように指示しています。 build/jacoco/STフォルダーの下に「jacocoST.exec」(別名Selenium Testのjacoco execファイル)という名前のjacoco .execファイルを作成します(私はGradleを使用しているため、ビルド/コンパイルを実行するたびにGradleが「build」フォルダーを作成します/ test/integrationTest/customSeleniumTaskThatYouMightHaveCreated)。

注:これは、テストタスクでjacocoセクションを指定する必要がないことを意味します(ビルドシステムのJVMで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's 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テストを実行します。注:-Linux/UnixマシンでJenkinsを使用しており、「xvfb」プラグインは非常に便利です。つまり、ヘッドレスモードでSelenium GUIテストを実行でき、テストが実行されているマシンでユーザーにバグを発生させません。 GUIテストの実行中にテストページをポップアップします。

    -Jenkinsで "xvfb"プラグインを使用する場合、[〜#〜] first [〜#〜]開始する必要がありますXvfb "テストを実行しているサーバー(Linux/Unix)上のサービス。

    -Windowsマシンで非ユニットテスト(インテグレーション/セレンなど)を実行している場合、テストを実行するとGUIテストがポップアップ表示されます。ポップアップウィンドウを表示したくない場合は、Jenkinsインスタンスでスレーブ(Windowsマシン)プロセスをサービスとして実行できます(「サービスとしてインストール」)。 Windowsマシンをスレーブとして作成した場合、マシンでJLNPインストールを実行すると、Jenkinsがスレーブプロセスを正常に開始したことを示すポップアップが表示されます。[ファイル]> [サービスとしてインストール]をクリックすると、Windowsマシンでスレーブが実行されます「ヘッドレス」として。

  2. テストの実行中に、今回、jacocoはdestfileパラメーターの定義された値に従ってフォルダー構造/ execファイルを作成しますが、それでも0またはいくつかの小さなサイズになります。

  3. Selenium /非ユニットテストが完了したら、Tomcat /ターゲットJVMを「停止」する必要があります。これにより、すべてのjacocoカバレッジ情報がこのjacocoST.execファイル(jacocoで作成するカスタムファイル)にフラッシュされます。 -注:jacocoST.execファイルをオンザフライでフラッシュしたい場合(Tomcat JVM /セッションを停止する必要はありません)、それを行う方法をjacocoのドキュメントで調べることができます。これについて説明するトピックが1つあります。このようにして、アプリケーションを実行し続けることができ、アプリケーション/ Webサービスを停止する必要はありません。

  4. JacocoTestReportタスクを実行すると、jacocoコードカバレッジが表示されます。

    • メインコードのソース/クラスの場所を指定してください。

例:

  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')
}

それでも問題が解決しない場合は、遠慮なくpingを送信してください。また、私がこれをどのように達成したかに関するスタックオーバーフローに関する私の投稿のいくつかと、同じカバレッジをSonarQubeに公開することも確認できます。

16
Arun Sangal

毛布は働くことができます。

これはJavaScriptライブラリです。

HTMLページのインポートに「data-cover」属性で注釈を付けます。

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

...そしてブランケットはJSファイルを、統計情報をレポートする注釈付きのコピーに置き換えます。

重要なステップは、包括的にコードカバレッジ統計を取得することですが、私が間違っていない場合、Seleniumには、ブラウザーエンジンでJavaScript関数を実行できるインターフェイスがあります。 APIは次のとおりです。

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

1
Bobby Marinoff