Hitachi

Advanced Shell 


3.10.4 カバレージ情報の表示

ジョブ定義スクリプトを実行し,カバレージ情報を表示するまでの流れを次の図に示します。

図3‒5 カバレージ情報の表示の流れ

[図データ]

なお,開発環境のエディタでもカバレージ情報を表示できます。エディタを使用してカバレージ情報を表示する方法の詳細については,「4.4.7 カバレージ情報を表示する」を参照してください。

〈この項の構成〉

(1) 表示方法とコマンドの形式

カバレージ情報は,カバレージ情報を表示するコマンド(adshcvshowコマンド)で表示します。コマンドに指定したascファイルの内容を表示します。-lオプションのオプション値としてジョブ定義スクリプトの範囲を指定することで,指定した範囲内のカバレージ情報を表示できます。

-sオプションを指定した場合,バックアップされているジョブ定義スクリプトの内容だけを表示します。-sオプションはascファイルのバックアップされているジョブ定義スクリプトの内容の確認やジョブ定義スクリプトとの差分を確認したいときに使用します。-sオプションを指定した場合,-lオプションによる範囲指定はできません。

カバレージ情報表示コマンドの形式を次に示します。

adshcvshow {[-l n1[-[n2]][,n3[-[n4]]]...]|-s} ascファイルのパス名

行指定の形式は,","で複数指定し"-"で範囲を指定します。例えば,1行目〜10行目と15行目と21行目〜30行目を指定したい場合,次のように指定します。

adshcvshow -l 1-10,15,21-30 ascファイルのパス名

"-"の後ろに数字を指定しなければ,前の値から最終行までの範囲を意味します。例えば,21行目から最終行まで指定したい場合,次のように指定します。

adshcvshow -l 21- ascファイルのパス名

(2) カバレージ情報の表示形式

カバレージ情報の表示形式の説明を,次の表に示します。

表3‒9 カバレージ情報の表示形式の説明

項目

説明

Advanced Shell カバレージ情報(Advanced Shell Coverage Information)

Advanced Shellで取得したカバレージ情報を示します。

日時(右上の部分)

adshcvshowコマンドを実行した日時をyyyy-mm-dd hh:mm:ssの形式で表示します。月,日,時,分,秒が1桁の場合は,先頭に0を付加します。

見出し情報(Header Information)

見出しを示します。

ジョブ定義スクリプト名(Shellscript Name)

ジョブ定義スクリプトの絶対パス名を表示します。

ascファイルのバージョン(Asc version)

ascファイルのバージョン番号を表示します。

カバレージ情報の採取開始時刻(Coverage Start Time)

カバレージ情報の採取開始時刻を表示します。形式は,日時と同じです。

カバレージ情報の採取終了時刻(Coverage End Time)

カバレージ情報の採取終了時刻を表示します。形式は,日時と同じです。

カバレージ情報の採取回数(Test Count)

カバレージ情報を採取した回数を表示します。

カバレージ情報の採取回数が9999を超えた場合,「9999+」と表示します。

バッチジョブを実行するコマンド(adshexecコマンド)のオプションの指定によって採取回数の数え方が変わります。

adshexecコマンド(-tと-dを指定)

  • メモリ上のカバレージ情報の場合

    ・初期値

    ascファイルがあるときは,ascファイルのカバレージ情報の採取回数となります。

    ascファイルがないときは,0となります。

    ・更新

    デバッガのrunコマンドの実行ごとにカバレージ情報の採取回数を1増やします。

  • ascファイルの場合

    adshexecコマンドの終了時にデバッガのrunコマンドの実行回数だけカバレージ情報の採取回数を増やします。

adshexecコマンド(-tを指定)

 adshexecコマンドの終了時にカバレージ情報の採取回数を1増やします。

adshexecコマンド(-dを指定)

  • メモリ上のカバレージ情報の場合

    ・初期値

    カバレージ情報の採取回数の初期値は0になります。

    ・更新

    デバッガのrunコマンドの実行ごとにカバレージ情報の採取回数を1増やします。

  • ascファイルの場合

    ascファイルは更新されません。

メイン情報(Main Information)

カバレージ情報(C0,C1情報)を表示します。

行番号(Line)

1から始まります。

行番号が9999を超えた場合,「9999+」と表示します。

付加情報(Info)

C0,C1情報の見出しです。カバレージ情報は,行単位に表示します。コマンドラインが複数行にまたがっている場合,コマンドが存在する行にC0,C1情報を表示します。

C0,C1情報のどちらも32個以内ならカバレージ情報を記録でき,この項目はスペースとなります。記録できない場合に表示される文字と意味を次に示します。

overC0:C0情報が32を超えています。

overC1:C1情報が32を超えています。

over:C0情報とC1情報の両方が32を超えています。

C0情報(C0)

C0情報を表示します。

@:コマンドが実行されました。

-:コマンドは実行されていません。

行に複数のコマンドが存在する場合,行の先頭から最大4個のコマンドまでのC0情報を4文字で表示します。

C1情報(C1)

C1情報を表示します。

@:実行パスが実行されました。

-:実行パスは実行されていません。

行に複数の実行パスが存在する場合,行の先頭から最大4個の実行パスまでのC1情報を4文字で表示します。

ジョブ定義スクリプト(<Shellscript Image>)

ジョブ定義スクリプトの内容を,行単位に表示します。範囲指定した場合,指定された範囲の行だけを表示します。

合計の情報(Total Information)

C0,C1情報の合計を表示します。範囲指定した場合,合計の情報以降は,表示されません。個数が99999999を超えた場合,「99999999+」と表示します。

C0,C1対象の総数(Target Total)

<C0>に対象コマンドの総数,<C1>に実行パスの総数を表示します。

<C0>

ジョブ定義スクリプト内のすべてのC0対象コマンドの個数を含みます。C0対象のコマンド数が32個を超える行が存在する場合でもすべての個数がカウントされます。

<C1>

ジョブ定義スクリプト内のすべてのC1対象実行パスの個数を含みます。C1対象の実行パス数が32個を超える行が存在する場合でもすべての個数がカウントされます。

C0,C1対象の実行した総数(Executed Total)

<C0>に実行したコマンドの総数,<C1>に実行した実行パスの総数を表示します。

<C0>

カバレージ情報として,実行を記録するのは,各行内で先頭からC0対象である32個のコマンドまでです。この32個のコマンド内の実行したコマンドが,カウントされます。

<C1>

カバレージ情報として,実行を記録するのは,各行内で先頭からC1対象である32個の実行パスまでです。この32個の実行パス内の実行した実行パスが,カウントされます。

C0,C1対象の未実行の総数(Unexecuted Total)

<C0>に未実行のコマンドの総数,<C1>に未実行の実行パスの総数を表示します。

<C0>

「C0対象の総数(Target Total)−C0対象の実行した総数(Executed Total)」になります。

<C1>

「C1対象の総数(Target Total)−C1対象の実行した総数(Executed Total)」になります。

実行比率(Coverage Rate)

C0とC1の実行比率(%)を表示します。小数点第2位以下を切り捨てて小数点第1位までを表示します。

<C0>

「C0対象の実行した総数(Executed Total)/C0対象の総数(Target Total)」になります。

C0対象のコマンド数が32個を超える行が存在した場合,すべてのコマンドを実行しても100%より小さくなります。

<C1>

「C1対象の実行した総数(Executed Total)/C1対象の総数(Target Total)」になります。

C1対象の実行パス数が32個を超える行が存在した場合,すべての実行パスを実行しても100%より小さくなります。

カバレージ情報を表示するコマンドの表示例を,C0,C1に情報を行ごとに1個まで表示した場合と4個まで表示した場合とに分けて示します。

(a) カバレージ情報を表示するコマンドの表示例(C0,C1に情報を行ごとに1個まで表示した場合)

この例では,C0とC1が取得されたことが,Main Informationのところに1個の「@」と「-」で表示されています。

                    * Advanced Shell Coverage Information *

                                                            2023-05-18 08:06:40
****    Header Information    **************************************************
Shellscript Name     : /home/user001/sample1.ash
Asc version          : 1.0
Coverage Start Time  : 2023-05-18 08:00:02
Coverage End Time    : 2023-05-18 08:03:30
Test Count           :    1

****    Main Information      **************************************************
Line   Info   C0   C1   <Shellscript Image>
    1
    2         @         echo 1
    3
    4         @    @    if true
    5                   then
    6         @           echo 2
    7              -    fi
    8
    9         @         echo 3
   10
   11         @    -    if false
   12                   then
   13         -           echo 4
   14              @    fi
   15
   16         @         echo 5
   17
   18         @    @    if true
   19                   then
   20         @           echo 6
   21              -    else
   22         -           echo 7
   23                   fi
   24
   25         @         echo 8
   26
   27         @    -    if false
   28                   then
   29         -           echo 9
   30              @    else
   31         @           echo 10
   32                   fi
   33
   34         @         echo 11
   35

****    Total Information     **************************************************
                         <C0>      <C1>
  Target     Total         15         8
  Executed   Total         12         4
  Unexecuted Total          3         4
--------------------------------------------------------------------------------
                         <C0>      <C1>
  Coverage   Rate        80.0 %    50.0 %

(b) カバレージ情報を表示するコマンドの表示例(C0,C1に情報を行ごとに4個まで表示した場合)

この例では,C0とC1が複数回取得されたことが,Main Informationの8行目と24行目に表示されています。

  • Lineの8行は,Lineの2行から6行までを1行に記述した場合です。

    C0の列の"@@@@"の各文字は,先頭から,"echo 1","echo 2","echo 3","echo 4"の各コマンドを実行したことを示します。

    C0の列の"@@@@"には,"echo 5"のコマンドを実行したことを示す情報はありません。

  • Lineの24行は,Lineの11行から22行までを1行に記述した場合です。

    • C0の列の"@@--"の各文字は,先頭から順に対応します。

      1文字目の"@"は,"true"のコマンドを実行したことを示します。

      2文字目の"@"は,"echo 1"のコマンドを実行したことを示します。

      3文字目の"-"は,先頭から1個目の"elif"の次にある"true"のコマンドを実行しなかったことを示します。

      4文字目の"-"は,"echo 2"のコマンドを実行しなかったことを示します。

      上記以外のコマンド,つまり,先頭から2番目の"elif"の次にある"true"以降のコマンドについての実行の有無は,C0の列の"@@--"の各文字には表示しません。

    • C1の列の"@---"の各文字は,先頭から順に対応します。

      1文字目の"@"は,"if"の最初の"then"の実行パスを実行したことを示します。

      2文字目の"-"は,先頭から最初の"elif"の"then"の実行パスを実行しなかったことを示します。

      3文字目の"-"は,先頭から2番目の"elif"の"then"の実行パスを実行しなかったことを示します。

      4文字目の"-"は,"else"の実行パスを実行しなかったことを示します。

  • Lineの53行は,Lineの27行から51行までを1行に記述した場合です。

    C0の列の"@@--"の各文字の意味,C1の列の"@---"の各文字の意味は,Lineの24行と同じです。

    2番目の"if"の"then"の実行パス(先頭から5番目の実行パス)以降の実行パスの実行の有無は,C1の列の"@---"の各文字には表示しません。

                        * Advanced Shell Coverage Information *
    
                                                                2023-05-18 08:06:40
    ****    Header Information    **************************************************
    Shellscript Name     : /home/user001/sample2.ash
    Asc version          : 1.0
    Coverage Start Time  : 2023-05-18 08:03:30
    Coverage End Time    : 2023-05-18 08:03:30
    Test Count           :    1
    
    ****    Main Information      **************************************************
    Line   Info   C0   C1   <Shellscript Image>
        1
        2         @         echo 1
        3         @         echo 2
        4         @         echo 3
        5         @         echo 4
        6         @         echo 5
        7
        8         @@@@      echo 1;echo 2;echo 3;echo 4;echo 5
        9
       10
       11         @    @    if true
       12                   then
       13         @           echo 1
       14         -    -    elif true
       15                   then
       16         -           echo 2
       17         -    -    elif true
       18                   then
       19         -           echo 3
       20              -    else
       21         -           echo 4
       22                   fi
       23
       24         @@-- @--- if true ;then echo 1 ;elif true ;then echo 2 ;elif true ;then echo 3 ;else echo 4 ;fi
       25
       26
       27         @    @    if true
       28                   then
       29         @           echo 1
       30         -    -    elif true
       31                   then
       32         -           echo 2
       33         -    -    elif true
       34                   then
       35         -           echo 3
       36              -    else
       37         -           echo 4
       38                   fi
       39
       40         @    @    if true
       41                   then
       42         @           echo 5
       43         -    -    elif true
       44                   then
       45         -           echo 6
       46         -    -    elif true
       47                   then
       48         -           echo 7
       49              -    else
       50         -           echo 8
       51                   fi
       52
       53         @@-- @--- if true ;then echo 1 ;elif true ;then echo 2 ;elif true ;then echo 3 ;else echo 4 ;fi; if true ;then echo 5 ;elif true ;then echo 6 ;elif true ;then echo 7 ;else echo 8 ;fi
       54
    
    ****    Total Information     **************************************************
                             <C0>      <C1>
      Target     Total         52        24
      Executed   Total         22         6
      Unexecuted Total         30        18
    --------------------------------------------------------------------------------
                             <C0>      <C1>
      Coverage   Rate        42.3 %    25.0 %

(3) C0情報とC1情報の表示方法

ジョブ定義スクリプトのスクリプト制御文の実行のしかたでカバレージ情報を採取する個所が変わります。カバレージ情報を表示した場合に実行された個所に「@」が表示されます。実行されなかった個所には,「-」が表示されます。

(a) if文の場合

  • elseがないときの表示方法

    thenのパスを実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    if           ←  C1を取得
    @           true       ←  C0を取得
              then
    @           cmd2       ←  C0を取得
    @           cmd3       ←  C0を取得
         -    fi           ←  C1を取得しない

    thenのパスを実行しなかった場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         -    if           ←  C1を取得しない
    @           false      ←  C0を取得
              then
    -           cmd2       ←  C0を取得しない
    -           cmd3       ←  C0を取得しない
         @    fi           ←  C1を取得

    thenのパスとthenでないパスの両方を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    if           ←  C1を取得
    @           false      ←  C0を取得
              then
    @           cmd2       ←  C0を取得
    @           cmd3       ←  C0を取得
         @    fi           ←  C1を取得
  • elseがあるときの表示方法

    thenを実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    if           ←  C1を取得
    @           true       ←  C0を取得
              then
    @           cmd2       ←  C0を取得
         -    else         ←  C1を取得しない
    -           cmd3       ←  C0を取得しない
              fi           ←  なし

    elseを実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         -    if           ←  C1を取得しない
    @           false      ←  C0を取得
              then
    -           cmd2       ←  C0を取得しない
         @    else         ←  C1を取得
    @           cmd3       ←  C0を取得
              fi           ←  なし

    thenおよびelseの両方を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    if           ←  C1を取得
    @           false      ←  C0を取得
              then
    @           cmd2       ←  C0を取得
         @    else         ←  C1を取得
    @           cmd3       ←  C0を取得
              fi           ←  なし

(b) for文の場合

  • ループを実行する場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    for          ←  C1を取得
              do
    @           cmd1       ←  C0を取得
         -    done         ←  C1を取得しない
  • ループを実行しなかった場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         -    for          ←  C1を取得しない
              do
    -           cmd1       ←  C0を取得しない
         @    done         ←  C1を取得
  • ループを実行する場合およびループを実行しなかった場合の両方を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    for          ←  C1を取得
              do
    @           cmd1       ←  C0を取得
         @    done         ←  C1を取得

(c) while文およびuntil文の場合

while文の表示方法を示します。until文も同じ表示になります。

  • ループを実行する場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    while        ←  C1を取得
              do
    @           cmd1       ←  C0を取得
         -    done         ←  C1を取得しない
  • ループを実行しなかった場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         -    while        ←  C1を取得しない
              do
    -           cmd1       ←  C0を取得しない
         @    done         ←  C1を取得
  • ループを実行する場合およびループを実行しなかった場合の両方を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
         @    while        ←  C1を取得
              do
    @           cmd1       ←  C0を取得
         @    done         ←  C1を取得

(d) case文の場合

*パターンの有無で,C1情報の表示方法が異なります。*パターンとは,case文でどのパターンにも一致しなかった場合のパターンです。

  • *パターンがある

    esacにC1情報を表示しません。

  • *パターンがない

    esacにC1情報を表示します。

  • *パターンがあるときの表示方法

    ケース1を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
              case $A in
         @      1)             ←  C1を取得
    @              echo "abc"  ←  C0を取得
                   ;;
         -      *)             ←  C1を取得しない
    -              echo "efg"  ←  C0を取得しない
                   ;;
              esac             ←  なし

    *パターンを実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
              case $A in
         -      1)             ←  C1を取得しない
                   echo "abc"
                   ;;
         @      *)             ←  C1を取得
    @              echo "efg"  ←  C0を取得
                   ;;
              esac             ←  なし

    ケース1および*パターンの両方を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
              case $A in
         @      1)             ←  C1を取得
    @              echo "abc"  ←  C0を取得
                   ;;
         -      *)             ←  C1を取得しない
    -              echo "efg"  ←  C0を取得しない
                   ;;
              esac             ←  なし
  • *パターンがないときの表示方法

    ケース1を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
              case $A in
         @      1)             ←  C1を取得
    @              echo "abc"  ←  C0を取得
                   ;;
         -      2)             ←  C1を取得しない
    -              echo "efg"  ←  C0を取得しない
                   ;;
         -    esac             ←  C1を取得しない

    ケース2を実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
              case $A in
         -      1)             ←  C1を取得しない
    -              echo "abc"  ←  C0を取得しない
                   ;;
         @      2)             ←  C1を取得
    @              echo "efg"  ←  C0を取得
                   ;;
         -    esac             ←  C1を取得しない

    *パターンを実行した場合は,次のように表示されます。

    C0   C1   ジョブ定義スクリプト
    @         case $A in       ←  C0を取得
         -      1)             ←  C1を取得しない
    -              echo "abc"  ←  C0を取得しない
                   ;;
         -      2)             ←  C1を取得しない
    -              echo "efg"  ←  C0を取得しない
                   ;;
         @    esac             ←  C1を取得

(e) #-adsh_step_startコマンドの場合

#-adsh_step_startコマンドの次の引数を指定した場合,先行のジョブステップやジョブ定義スクリプト中のスクリプト拡張コマンドの状態によって,そのジョブステップを実行するかどうかが変わります。

[-run {normal|abnormal|always}]

ジョブステップを実行したかどうかを判断できるように,C1情報に次の情報を表示します。

  • --:この#-adsh_step_startまで実行が到達していません。

  • N-:先行のジョブステップ,またはジョブ定義スクリプトが正常です。

  • -A:先行のジョブステップ,またはジョブ定義スクリプトが異常です。

  • NA:「N-」と「-A」の両方のケースを実行しました。

(f) #-adsh_step_errorコマンドの場合

ジョブステップ内でエラーが発生した場合,#-adsh_step_errorコマンドに続くジョブ定義スクリプトを実行します。このエラー処理を実行したかどうかを判断できるように,C1情報に次の情報を表示します。

  • --:この#-adsh_step_errorを含むジョブステップまで実行が到達していません。

  • N-:ジョブステップ内でエラーは発生していないため,エラー処理を実行していません。

  • -E:ジョブステップ内でエラーは発生していたため,エラー処理を実行しました。

  • NE:「N-」と「-E」の両方のケースを実行しました。

(g) 関数の場合

関数の実行例を次に示します。

C0   C1    ジョブ定義スクリプト
           funcAAA(){                 →1.
@              echo "start funcAAA"   →2.
     @         if true                →2.
               then                   →2.
@                echo true            →2.
     -         else                   →2.
-                echo false           →2.
               fi                     →2.
           }
             :
@          funcAAA                    →3.
  1. 関数を実行した場合には,関数が定義されているところには,C0情報,C1情報を表示しません。

  2. 関数の本体には,実行したコマンド,実行パスのC0,C1情報を表示します。

  3. 関数を実行した場合には,関数を呼び出したところにC0情報を表示します。

(h) ( cmd1; cmd 2 )の場合

括弧で囲ったコマンドを別プロセスで実行します。この場合,コマンドグループ全体,コマンドグループ内の各コマンドに対して,カバレージ情報は採取しません。

(i) { cmd1; cmd2 }の場合

中括弧で囲んだコマンドを,adshexecコマンドと同一プロセスで実行します。この場合,コマンドグループ内の各コマンドに対して,カバレージ情報を採取します。

(j) cmd1 &の場合

adshexecコマンドによるジョブ定義スクリプトの実行と並行して,バックグラウンドで別プロセスを生成してコマンドを実行します。バックグラウンドで実行されるジョブ定義スクリプトでは,カバレージ情報は採取しません。

(k) trapのアクションの場合

trapのアクションでは,カバレージ情報を採取しません。

  • trap "date; echo xxx" INT

(l) コマンド置換の場合

コマンド置換で実行するコマンド,スクリプト制御文のカバレージ情報は採取しません。

  • ls `which adshexec`

(m) timeコマンドの引数の場合

timeコマンドの引数として実行するコマンドは,カバレージ情報を採取しません。

  • time adshexec script1

(n) evalコマンドの引数の場合

evalコマンドの引数として実行するコマンドは,カバレージ情報を採取しません。

  • eval ls dir1

(o) パイプ機能の場合

パイプ機能を使用して実行しているコマンドのカバレージ情報は採取しません。

  • ls | cat

(p) 外部スクリプトの場合

外部スクリプトの呼び出し先では,カバレージ情報を採取しません。外部スクリプトの呼び出し元では,カバレージ情報を採取します。なお,外部スクリプトの呼び出しは,C0の対象ですが,C1については,対象外です。

(4) メモリ上に採取しているカバレージ情報の表示【UNIX限定】

デバッグ用のinfo coverageコマンドを使用した場合,メモリ上に採取している,カバレージ情報を表示できます。

表示するカバレージ情報は,初回蓄積か継続蓄積かどうかで変化します。初回蓄積の場合は,中断点までのカバレージ情報を表示します。継続蓄積の場合は,蓄積されたカバレージ情報に中断点までのカバレージ情報を合わせた結果を表示します。蓄積を指定しなかった場合は,初回蓄積の場合と同様に中断点までのカバレージ情報を表示します。

表示する情報の種類と形式は,カバレージ情報を表示するコマンド(adshcvshowコマンド)の場合と同じです。

(5) C1実行比率100%とならないケース

#-adsh_step_startコマンドを使用していて,そのジョブステップに先行するジョブステップ,またはコマンドがない場合,すべての実行パスを実行してもC1実行比率が100%となりません。#-adsh_step_startコマンドは次の両方のケースをC1情報として取得しますが,#-adsh_step_startコマンドで定義するジョブステップに先行するジョブステップまたはコマンドがない場合,2.のケースを実行できないためです。

  1. 先行するすべてのジョブステップ,コマンドが正常終了している。

  2. 先行するジョブステップ,コマンドで正常終了していないものがある。

この場合,デバッグ時にエラー注入モードを有効にして該当個所でエラーをシミュレートする方法があります。これによってC1情報が取得され,C1実行比率を100%にすることができます。エラーのシミュレート方法を次に示します。