3 Replies Latest reply: Feb 7, 2013 8:43 PM by asahide RSS

     カバレッジがおかしい

    989738
      SQL Developerでカバレッジ計測をしています。
      しかし、なんだかカウントがおかしい気がします。

      下記はサンプルコードの実施結果です。

      TEXT                         Occurrences
      -----

      FUNCTION COVERAGE_BUG                   0
       RETURN VARCHAR2                       0
      AS                                   0
        V_CHK NUMBER(1);                      0
      BEGIN                                 0
        V_CHK := 0;                           1

        FOR I IN 1..2                          3
        LOOP                               0
         V_CHK := V_CHK + 1;                   2
         IF I < 2 THEN                        2
           DBMS_OUTPUT.PUT_LINE('V_CHK = ');       2
           DBMS_OUTPUT.PUT_LINE(V_CHK);         1
         END IF;                             0
        END LOOP;                           0

       RETURN NULL;                          1

      END COVERAGE_BUG;                      1

      -----

      ここで下記のIF文がおかしいです。
      ①  IF I < 2 THEN                    2
      ②   DBMS_OUTPUT.PUT_LINE('V_CHK = ');  2
      ③   DBMS_OUTPUT.PUT_LINE(V_CHK);    1
      ④  END IF;                        0

      ②と③は発生回数が同じでなければならない(1回ずつ)のに、②が2回になってしまっています。
      SQL Developerのバグでしょうか?
      Oracleのプロファイラによるカバレッジはこんな感じになってしまうのでしょうか?

      ご教授、よろしくお願いします。

      Edited by: 986735 on 2013/02/07 3:16
        • 1. Re:  カバレッジがおかしい
          asahide
          Developerには明るくありませんが。。

          使用されているバージョンは記載した方が良いと思います、後、
          タグで囲むと見易くなります。
           [ユニット・テスト|http://docs.oracle.com/cd/E38764_01/appdev.32/b70214/unit_testing.htm]  を使用されているんですよね。
          
          例えば他の似たようなファンクション等ではどのような結果になりますでしょうか。
          実例を積み重ねてオラクルさんに確認、という位しかないような気がします。。。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
          • 2. Re:  カバレッジがおかしい
            989738
            asahideO ありがとうございます。

            バージョンです
             ・Oracle SQL Developer 3.2.20.09 ビルドMAIN-09.87
             ・(拡張機能)Oracle SQL Developer - UNIT Test 11.2.0.09.87
            ・クライアントOS WindwosXP SP3
             ・接続先データベースはOracle9i
            オラクルさんに確認
            これはどのようにすればいいでしょうか?
            問い合わせ先などを探してみましたが、見つかりませんでした。

            似たようなファンクションを試してみたので結果を掲載します。
            IF①とIF②は全く同じはずなのに、出方が違います。
            またIF④は正しくカウントされてます。
            1回目のIF文がおかしい感じです。。
            TEXT                                                       Occurrences
            ----------------------------------------------------------------------
            FUNCTION COVERAGE_BUG2                                          0
                    RETURN VARCHAR2                                         0
                AS                                                          0
                    V_CHK NUMBER(1);                                        0
                BEGIN                                                       0
                    V_CHK   := 0                                            1
                                                                            0
                    -- IF文①(条件はTrue)                                 0
                    IF V_CHK = 0 THEN                                       1
                        DBMS_OUTPUT.PUT_LINE('Check Point A')               2
                        DBMS_OUTPUT.PUT_LINE(V_CHK)                         1
                    END IF                                                  0
                                                                            0
                    -- IF文②(IF文とまったく同じ)                         0
                    IF V_CHK = 0 THEN                                       1
                        DBMS_OUTPUT.PUT_LINE('Check Point A')               1
                        DBMS_OUTPUT.PUT_LINE(V_CHK)                         1
                    END IF                                                  0
                                                                            0
                    -- IF文③(条件はFalse)                                0
                    IF V_CHK = 1 THEN                                       1
                        DBMS_OUTPUT.PUT_LINE('Check Point B')               0
                        DBMS_OUTPUT.PUT_LINE(V_CHK)                         0
                    END IF                                                  0
                                                                            0
                    FOR I IN 1..2                                           3
                    LOOP                                                    0
                        V_CHK := V_CHK + 1                                  2
                        -- IF文④(2回通過。1回目True。2回目False)         0
                        IF I   < 2 THEN                                     2
                            DBMS_OUTPUT.PUT_LINE('Check Point C')           1
                            DBMS_OUTPUT.PUT_LINE(V_CHK)                     1
                        END IF                                              0
                    END LOOP                                                0
                    RETURN NULL                                             1
                END COVERAGE_BUG2;                                          1
            • 3. Re:  カバレッジがおかしい
              asahide
              確かに見た感じはおかしいように見えますね。。
              オラクルさんに確認
              これはどのようにすればいいでしょうか?
              問い合わせ先などを探してみましたが、見つかりませんでした。
              こちらはデータベースのサポート契約が何かあれば、問い合わせる事が可能だと思います。
              <<https://support.oracle.com/epmos/faces/MosIndex.jspx>>



              他にエキスパートがどなたか回答してくれるかもしれません。。