CUnit Test Code Coverage - ntut.edu.twjykuo/course/CUnitCodeCoverage.pdf · 2 Gcovand Gprof...

18
C Unit Test Code Coverage 國立臺北科技大學資訊工程系 郭忠義 1

Transcript of CUnit Test Code Coverage - ntut.edu.twjykuo/course/CUnitCodeCoverage.pdf · 2 Gcovand Gprof...

  • C Unit TestCode Coverage

    國立臺北科技大學資訊工程系

    郭忠義

    1

  • 2

    Gcov and Gprof Gcov (GCC coverage)

    程式碼測試覆蓋率工具,統計每一行程式執行次數

    Gprof (profiling tool) 程式分析工具,評估哪一段程式最耗時

  • 3

    Gcov - GCC Coverage Code::Blocks開啟project: Console Application,寫以下程式

    //main.c#include #include int getFinal(int, int);void test01() {

    assert(final(50,1)>=60);assert(final(50,0)

  • 開一個專案

    File – New – Project – Console application – Go – Next - C

    4

  • 開一個專案

    File – New – File – C/C++ source – Go – main.c

    5

  • 開一個專案

    File – New – File – C/C++ source – Go – getScore.c

    6

  • 7

    Gcov - GCC Coverage 選擇Project > Build options…

    在Pre/Post build steps,填入gcc -pg -fprofile-arcs -ftest-coverage -o main main.c getScore.cmain

  • 8

    Gcov - GCC Coverage 選擇Tools > Configure tools…

    在Add新增一個Tools

  • 9

    Gcov - GCC Coverage 填入

    gcovC:\Program Files (x86)\CodeBlocks-EP\MinGW\bin\gcov.exemain.c getScore.c${PROJECT_DIR}

  • 10

    Gcov - GCC Coverage 編譯執行,產生

    main.gcda文件(gcov data文件) main.gcno文件(gcov note文件) getScore.gcda文件(gcov data文件) getScore.gcno文件(gcov note文件) 可執行程式main.exe

  • 11

    Gcov - GCC Coverage 執行剛新增的Tools

    Tools > gcov 看到code coverage為100.00%

    同時產生main.c.gcov, getScore.gcov 紀錄每行程式碼執行次數

  • 12

    Gcov - GCC Coverage 使用記事本打開main.c.gcov

    查看執行次數(黃色)與行數(紅色)

  • 13

    Gprof 選擇Tools > Configure tools…

    在Add新增一個Tools

  • 14

    Gprof 填入

    gprofC:\Program Files (x86)\CodeBlocks-EP\MinGW\bin\gprof.exe-b main.exe gmon.out${PROJECT_DIR}

  • 15

    Gprof 修改程式getFinal.c

    // getScore.cvoid delay(int t) {

    long goal=99900000*t, i=0;while (goal > i) {

    t = t*t*t*t-t*t*t*t; i++;}

    }void wait(int t) {

    long goal=49900000*t, i=0;while (goal > i) {

    t = t*t*t*t-t*t*t*t; i++;}

    }

    /int getPresent(int p) {delay(8);if (p==0) return 0;else return 1;

    }int getFinal(int score, int present) {

    present = getPresent(present);wait(4);if (score>=50) {

    if (present==1) {score=60;

    }}return score;

    }

  • 16

    Gprof 重新編譯執行,分析執行時間,專案資料夾產生檔案

    gmon.out是gprof用來分析檔案

  • 17

    Gprof 執行Tools > gprof ,分析結果

    %time function使用占全部時間的百分比

    cumulative seconds function累積執行的時間

    self seconds function本身執行的時間

    calls function被呼叫的次數

    self Ts/call 每次呼叫,花費在function上的時間

    total Ts/call 每次呼叫,花費在function及子function平均時間

    name 檔案名稱

  • 18

    Gprof- call graph

    Spontaneous自發的

    呼叫它的function

    被呼叫的function

    被呼叫的function

    執行時間占比

    被它呼叫的時間

    被它呼叫的時間

    自己執行所佔時間

    自己執行所佔時間

    getPresent呼叫delay執行所佔時間

    Function的編號

    自發的