Lattix/Understandのメトリクスをデータ分析してみた(Understandメトリクスの簡単な可視化・分析)

はじめに

本シリーズではLattixとUnderstandのメトリクスを活用した様々な分析方法を、分析スクリプトとして紹介しております。
前回のテーマ(Sturtevantの構造複雑度を使用したメトリクス分析)に続き、今回は分析スクリプト第2弾となります。
今回のテーマは「Understandメトリクスの簡単な可視化・分析」です。

本記事では、Understandから出力したメトリクスレポート(csv)をPythonのスクリプトで読み取り、
自動で集計して結果をPlotlyのグラフとして出力するスクリプトをご紹介します。
本スクリプトを利用することで「開発ソフトウェアの内部品質を分析し要約すること」や、「問題となり得るファイルや関数を抽出すること」が可能です。
なお、GitまたはSubversionをご利用の場合には、リポジトリURLと言語を指定することで、自動的にプロジェクトを作成、メトリクスを出力することができるため、別途メトリクスレポートを用意せずにご利用可能です。

※Understandについては、こちらを参照ください。

本スクリプトの活用方法の例

本スクリプトの活用方法の例を示します。

  1. jupyter環境における実行
    分析者の方がプロジェクトの状況を把握する際にご利用いただけます。
    (例)品質担当の方が利用する
    リファクタリング実施が決まった際、リファクタリングプロジェクト実施前後での効果測定に利用する。
    (例)ソフトウェアの受け入れ担当の方が利用する
    外注したソフトウェアの内部品質に不安がある際、プロジェクト前後で巨大または複雑な関数がどの程度増えているか測定する際に利用する。
  2. CI環境における実行
    本スクリプトをCI環境においてプロジェクトレポートとしてご活用いただけます。
    (例)課長やチームリーダーの方が利用する
    プロジェクトの状態をウィークリービルド時にプロジェクトの状態を定期的に計測・保存し、グラフや表を利用して、「先週と比較して閾値を超える関数の数が増えていないか」を把握し、週次ミーティングの際にメンバーの方に「具体的な関数名を指摘」してフィードバックする。

    [CI環境で実行する際のコマンドの例]
    1. コマンド実行する。(スクリプト内で実行結果を外部出力実施)
    jupyter execute {ファイル名}.ipynb
    2. コマンド実行の上、実行結果をipynbのフォーマットのままhtmlに変換して保存する。
    (スクリプト内で実行結果を外部出力実施)
    jupyter nbconvert --to notebook --execute {ファイル名}.ipynb
    jupyter nbconvert --to html {ファイル名}.nbconvert.ipynb


    ※実行時に使用されるPython実行カーネルは、ipynb保存時に設定されているカーネルとなります。

本スクリプトのダウンロード

  • 本スクリプトのダウンロードについて

今回ご紹介するスクリプトの内容はこちら(html)からご確認いただけます。(ipynbスクリプトを実行後、htmlに変換したものとなります。)
※23.09.01 システムコマンドの実行方法修正のため、掲載スクリプト(html)を更新しました。
実行可能ファイル形式(pyやipynb)をご希望の方は、弊社(テクマトリックス社)SciTools製品カスタマーセンターまでご連絡ください。
本スクリプトに関するご意見やフィードバックにつきましても、ご連絡いただけますと幸いです。

  • 重要本スクリプト内の初期化処理についての注意事項

本スクリプト内の初期化処理内でshutil.rmtree(…)によりディレクトリを削除する処理を実行します。配布段階では、実行者の意図しないディレクトリ削除を防ぐため、該当行をコメントアウトし、代わりに削除しようとしているディレクトリのパス名をprintする設定にしています。
初期化処理にてディレクトリ削除を行わない場合は、スクリプトは正しく動きません。
実行される場合は必ず、削除されるディレクトリのパス名が正しいかを確認いただいたうえで、該当行を有効にして実行してください。
※なお、本処理の代わりに毎回実行前に手動で対象ディレクトリを削除いただく形でも動作します。
※配布するhtmlにおいては、スクリプト実行後、”ディレクトリを削除する箇所をコメントアウトしたもの”を配布用にしております。

  • Pythonの実行環境について

Pythonの実行環境はvenvを利用した仮想環境で作成いただくことをお勧めしております。
パッケージのインストールに関しては、こちら(txt)から実行時の弊社環境のrequirement.txtをご確認いただけます。

本スクリプトで実現できること

本スクリプトで実現できることは以下の通りです。

データ取り込み

  • (オプション)GitリポジトリURL、言語指定により、最新リビジョンに対してUnderstandプロジェクト自動作成、およびメトリクス出力
  • (オプション)SvnリポジトリURL、言語指定により、最新リビジョンに対してUnderstandプロジェクト自動作成、およびメトリクス出力
  • Understandが出力したメトリクスデータ(csv)からデータ読み込み

分析結果の出力(関数粒度

  • 関数粒度のメトリクス毎に各メトリクス値のワースト10関数を棒グラフで表示
    (CountLine, Cyclomatic, Essential, MaxNesting, CountLineComment等で実施)
    (メトリクスは任意で指定可能)
関数粒度のメトリクス(棒グラフ)の例
  • 関数粒度のメトリクスを2つ使用し散布図を表示(CountLine vs Cyclomaticで実施)
    (メトリクスは任意で指定可能)
    • 1つ目のメトリクスのワースト10のみ表示も可能
    • ファイル粒度でも表示可能
関数粒度のメトリクス(散布図)の例
  • 関数粒度のメトリクスを2つ使用し、閾値毎の領域別に関数の数を集計表示(割合での表示も可能)(メトリクスは任意で指定可能)
関数粒度のメトリクス(領域別の関数の数)の例
関数粒度のメトリクス(領域別の関数の割合)の例

分析結果の出力(ファイル粒度

  • ファイル粒度のメトリクス毎に各メトリクス値ワースト10ファイルを棒グラフで表示(CountLine, MaxCyclomatic等で実施)(メトリクスは任意で指定可能)
ファイル粒度のメトリクス(棒グラフ)の例
  • そのほか、スクリプトにおいて、関数粒度で実現していることは、基本的にはファイル粒度でも実現できるようにコードを記述

分析結果のアーカイブ出力(Resultフォルダに含まれる結果をzip形式で保存します。)

  • メトリクスレポートの保存([csv]形式)
  • 分析結果(グラフ)の保存([.html]形式)
  • 分析結果(「グラフ」および「表」出力時の数値データ)の保存([.csv]形式)
  • Understand解析時のUnderstandプロジェクト解析データの保存([.und]形式)
  • Understand解析時の言語設定情報の保存(und_settings_lang.txt)

弊社で用意した実行環境/ディレクトリ構成

本スクリプトは動作保証を行うものではございませんが、弊社環境では問題なく動作しております。
参考までに以下に弊社で用意した実行環境(Linux)を記載します。
なお、実行時のディレクトリ構成(Windows/Linux)はこちら(html)からご確認いただけます。

  • 実行環境(Linux)について
環境バージョン等備考
インスタンスAWS EC2インスタンス
t3.large
OSAmazon Linux 2023 都合上AmazonLinuxを使用しておりますが、
Understandのサポート対象外OSとなります点ご留意ください。
※本スクリプトのRedhat 9環境での実行実績もございます。
PythonPython 3.9.16Pythonの仮想環境を“venv”および、本記事で配布しているrequirements.txtにより構築いただくことを強く推奨いたします。
※作成したPython仮想環境はpython -m ipykernel install –user –name=(仮想環境名)のようにJupyterLabのカーネルとして追加可能です。
JupyterLab3.6.2
(Node.js)必須ではありません。
※JupyterLab上でPlotlyのグラフを表示する場合は必要ですが、インストールされていない場合でもResultディレクトリ配下には結果が正しく出力されます。
Understand6.0 (Build 1076)
または
6.3 (Build 1139)
$PATHへundコマンドのインストール先を追加
スクリプト実行ユーザーが実行ディレクトリにおいて
“und”コマンドを実行可能である必要があります。
弊社の環境ではUnderstand 6.0, Understand 6.3の両方で実行確認を実施しました。(実行にはいずれかのバージョンがインストールされていれば利用可能です。)
(Git)2.39.2必須ではありません。後述のis_gitがTrueの場合に必要です。
yum install -y git
(Subversion)1.14.2 必須ではありません。 後述の is_svnがTrueの場合に必要です。
yum install -y subversion
  • 実行環境(Windows)について
    本記事では詳細は割愛いたしますが、弊社ではJupyter Lab Desktopというツールを利用することで、Windows上でも本スクリプトは問題なく動作しております。
    インストールなどは非常に簡単であるため、Windows上で実行される方はぜひご利用をご検討ください。

スクリプト内で実行していること

  1. (オプション)GitまたはSvnからソースコードcheckout、コード解析、Understandメトリクス取得
  2. csvよりメトリクスデータ読み込み
  3. 関数表(df_understand_FM)、ファイル表(df_understand_File)にメトリクスデータ格納
  4. 各グラフの表示
  5. 結果の出力(Resultディレクトリ)、Resultディレクトリのアーカイブ(zip)化

スクリプト内で実行時に設定する値/利用するコマンド/実行時の注意点

実行時に設定する値/利用するコマンド/実行時の注意点についてはこちら(.html)からご確認いただけます。

終わりに

本スクリプトを利用することで、ソフトウェア開発プロジェクトの状態を簡単に分析し、状況を把握したり、問題となり得るファイルや関数を抽出いただけます。
また、CI環境で利用されることで、各リビジョンごとにコードの問題点をスナップショットのように、記録しておくことが可能です。
本スクリプトが皆様のソフトウェア開発に少しでもお役に立てることを願っております。

今回は以上となります。
最後までご覧いただきありがとうございました。

タイトルとURLをコピーしました
Close Bitnami banner
Bitnami