Qulacs-Osaka / qulacs-osaka

Development branch of qulacs at Osaka Univ
MIT License
13 stars 6 forks source link

correspond to the use of lcov #309

Closed KowerKoint closed 2 years ago

KowerKoint commented 2 years ago

lcov を導入してテストのカバレッジを確認できるようにしました。

gcov/lcovの詳細な使い方は後でドキュメントに書きますが、

  1. cmakeでコンパイルオプションに --coverage をつけることでビルド時に gcno ファイルが作られる
  2. この状態でビルド済みライブラリを実行する(ここではテストを走らせる)と gcda ファイルが作られ、コードのどの部分が実行されていないか、どの部分は実行されていなかったかが書き込まれる
  3. lcov を用いてこの情報をリッチなHTMLにコンバートし、視覚化する

という流れになっています。

CMakeLists.txt を書き換えたのでビルド→テストを実行した後 script/generate_lcov_html.sh を実行すると coverage/html にHTMLが作られます。 index.html をブラウザで開くと確認できるようになっています。

KowerKoint commented 2 years ago

参考 https://qiita.com/imasaaki/items/0021d1ef14660184f396 https://github.com/linux-test-project/lcov https://linux.die.net/man/1/lcov

KowerKoint commented 2 years ago

チュートリアルをdeveloper-docsに書いたのでそちらも合わせてご確認お願いします

KowerKoint commented 2 years ago

cmakeのtargetを追加する話、testターゲットのCOMMANDに今のスクリプトの内容を追加すればいいですか。 現状USE_TESTがセットされていたらテストのコンパイル時にgcnoを生成するようになっているので問答無用でカウントはする状態になっていて、それならテストのデフォルトとしてカバレッジ生成を行うのでいいと思っています。

テストであっても明示したときのみ--coverageを付けてビルドするようにするにはbuild/Makefileにターゲットと「コンパイルオプションを追加する命令」が追加されるようにする必要があるんですがこの仕組みをよく理解していません…

ikanago commented 2 years ago

generator expression を使えばフラグを渡したときだけカバレッジをとるようにはできそうですが,ややこしくなるので常にカバレッジをとるようにしていいと思います

KowerKoint commented 2 years ago

明らかにCIでlcovを実行するのは無駄だしLinux以外(特にWindows)でlcovを導入するのは困難なのでやっぱりフラグを求めたほうが良さそうです…

KowerKoint commented 2 years ago

makeのtargetとしてcoverageを追加したんですが、現状

Capturing coverage data from build/src/csim/CMakeFiles/csim_static.dir build/src/cppsim/CMakeFiles/cppsim_static.dir build/src/cppsim_experimental/CMakeFiles/cppsim_exp_static.dir build/src/vqcsim/CMakeFiles/vqcsim_static.dir
Found gcov version: 9.4.0
Using intermediate gcov format
geninfo: ERROR: cannot read build/src/csim/CMakeFiles/csim_static.dir!

のようになって落ちてしまいます… 原因調査してますが、どうもよくわかってません😢

forest1040 commented 2 years ago

明らかにCIでlcovを実行するのは無駄だしLinux以外(特にWindows)でlcovを導入するのは困難なのでやっぱりフラグを求めたほうが良さそうです…

まだCIとlcovをよく見れていないのですが、Linux以外の環境依存する箇所があまりないのであればいいのでしょうけれど。。 まぁ、環境依存系のカバレッジをとるだけのジョブを追加して、定例とは別に手動なり、半自動なりで実行してもいいかも知れませんね。

ちょっとlcovやカバレッジ見てみます。。

forest1040 commented 2 years ago

makeのtargetとしてcoverageを追加したんですが、現状 原因調査してますが、どうもよくわかってませんcry

${CMAKE_CURRENT_SOURCE_DIR}/ をつけるとよいと思います。

forest1040 commented 2 years ago

@KowerKoint

${CMAKE_CURRENT_SOURCE_DIR}/ をつけるとよいと思います。

こんな感じです。

        add_custom_target(coverage
            DEPENDS test
            COMMAND mkdir -p coverage
            COMMAND lcov -d ${CMAKE_CURRENT_SOURCE_DIR}/build/src/csim/CMakeFiles/csim_static.dir -d ${CMAKE_CURRENT_SOURCE_DIR}/build/src/cppsim/CMakeFiles/cppsim_static.dir -d ${CMAKE_CURRENT_SOURCE_DIR}/build/src/cppsim_experimental/CMakeFiles/cppsim_exp_static.dir -d ${CMAKE_CURRENT_SOURCE_DIR}/build/src/vqcsim/CMakeFiles/vqcsim_static.dir -c -o ${CMAKE_CURRENT_SOURCE_DIR}/coverage/coverage.info
            COMMAND lcov -r ${CMAKE_CURRENT_SOURCE_DIR}/coverage/coverage.info "*/include/*" -o ${CMAKE_CURRENT_SOURCE_DIR}/coverage/coverageFiltered.info
            COMMAND genhtml -o ${CMAKE_CURRENT_SOURCE_DIR}/coverage/html --num-spaces 4 -s --legend ${CMAKE_CURRENT_SOURCE_DIR}/coverage/coverageFiltered.info
        )

PR作るのめんどい。。

KowerKoint commented 2 years ago

修正しました ビルド後、make coverage -C build でテストとともにカバレッジ生成できるのを確認してください。

ikanago commented 2 years ago

test と coverage の生成できました 👍

forest1040 commented 2 years ago

make coverage -C build

自分も生成できました!