Windowsにサイクロマティック複雑度の計測ツール「lizard」入れてみた

# 目的
業務で簡単に品質等を確認したい

# 環境
OS:Windows10
Python
pip
lizard
jinja2

# 環境作成ではまりそうなポイント
```terminal
Could not install packages due to an EnvironmentError: [WinError 5] アクセスが拒否されました 。: 'c:\\program files\\python37\\lib\\site-packages\\pip-19.0.3.dist-info\\entry_points.txt'
Consider using the `--user` option or check the permissions.

You are using pip version 19.0.3, however version 19.2.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
```

> このようなエラーになった場合は、コマンドプロンプトを管理者権限で起動させてください。そうすることで以下のように成功します。管理者権限使えない環境については、--userオプションをつけてインストールする。

```terminal
C:\WINDOWS\system32>python -m pip install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/62/ca/94d32a6516ed197a491d17d46595ce58a83cbb2fca280414e57cd86b84dc/pip-19.2.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 19.0.3
    Uninstalling pip-19.0.3:
      Successfully uninstalled pip-19.0.3
Successfully installed pip-19.2.1
```

# lizardのインストール
```terminal
C:\WINDOWS\system32>pip install lizard
Collecting lizard
  Using cached https://files.pythonhosted.org/packages/7e/01/650cfb0e613217003fe29d7edba549b71731122a5dc6e61fc41ad6f58fb8/lizard-1.16.3-py2.py3-none-any.whl
Installing collected packages: lizard
Successfully installed lizard-1.16.3
```

# 操作方法
>標準出力
今回はJavaのソースのCCNを計測してみます。

> -l オプションの値は言語に応じて変更してください。

## プロジェクトのルートフォルダへ移動してlizard実行
```terminal
C:\spring-boot-rest-api-sample-master\web-demo-2\spring\demo-2>
lizard -l java
================================================
  NLOC    CCN   token  PARAM  length  location
------------------------------------------------
      43      8    307      1      48 MavenWrapperDownloader::main@55-102@.\.mvn\wrapper\MavenWrapperDownloader.java
       9      1     75      2       9 MavenWrapperDownloader::downloadFileFromURL@104-112@.\.mvn\wrapper\MavenWrapperDownloader.java
       5      1     37      2       5 IndexController::hello@18-22@.\src\main\java\com\web\demo\controller\IndexController.java
       5      1     37      2       5 IndexController::formHoge@25-29@.\src\main\java\com\web\demo\controller\IndexController.java
       5      1     37      2       5 IndexController::root@32-36@.\src\main\java\com\web\demo\controller\IndexController.java
       3      1     20      1       3 WebDemo2Application::main@11-13@.\src\main\java\com\web\demo\WebDemo2Application.java
       2      1      5      0       2 WebDemo2ApplicationTests::contextLoads@13-14@.\src\test\java\com\web\demo\WebDemo2ApplicationTests.java
4 file analyzed.
==============================================================
NLOC    Avg.NLOC  AvgCCN  Avg.token  function_cnt    file
--------------------------------------------------------------
     69      26.0     4.5      191.0         2     .\.mvn\wrapper\MavenWrapperDownloader.java
     28       5.0     1.0       37.0         3     .\src\main\java\com\web\demo\controller\IndexController.java
     10       3.0     1.0       20.0         1     .\src\main\java\com\web\demo\WebDemo2Application.java
     12       2.0     1.0        5.0         1     .\src\test\java\com\web\demo\WebDemo2ApplicationTests.java

=============================================================================================
No thresholds exceeded (cyclomatic_complexity > 15 or length > 1000 or parameter_count > 100)
==========================================================================================
Total nloc   Avg.NLOC  AvgCCN  Avg.token   Fun Cnt  Warning cnt   Fun Rt   nloc Rt
------------------------------------------------------------------------------------------
       119      10.3     2.0       74.0        7            0      0.00    0.00
```

> メソッドごとのCCN→ファイルごとのCCN平均→全ファイルのCCN平均 の順で出力されます。

>「メソッドごとのCCN」について、各列の意味は以下の通りです。

|列	           |略    	       |説明                |
|:----------------:|:-----------------:|:------------------:| 
|NLOC	　　　　    |Number Line Of Code|	コードの行数(コメントを除く)|
|CCN	           |Cyclomatic Complexity Number|	サイクロマティック複雑度|
|token	           |-	|？|
|PARAM	           |PARAMeter|	メソッドの引数の数|
|length	           |-	|NLOCから空行を除いた行数|
|location	   |-	|{メソッド名}@{開始行}-{終了行}@{ファイルパス}|

## CSV出力
```terminal
lizard -l java --csv > resule_lizard.csv
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/02e854b6-63fc-c542-d9ba-35507d983017.png)



## HTML出力

```terminal
pip install jinja2
Collecting jinja2
  Downloading https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl (124kB)
     |████████████████████████████████| 133kB 242kB/s
Collecting MarkupSafe>=0.23 (from jinja2)
  Downloading https://files.pythonhosted.org/packages/65/c6/2399700d236d1dd681af8aebff1725558cddfd6e43d7a5184a675f4711f5/MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl
Installing collected packages: MarkupSafe, jinja2
Successfully installed MarkupSafe-1.1.1 jinja2-2.10.1
```

> HTML形式で出力する場合、jinja2というツールが必要なためpipでインストールする

```terminal
lizard -l java --html > resule_lizard.html
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/1d5b4e39-84d3-a854-21be-bbc31cdbad35.png)

# まとめ
今回はJavaファイルのみの検証でしたが、JSファイルの検証等もできたので
いろいろ試してみてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/2c578a76-72a9-10bc-6b34-b63b23ae5ca7.png)

# 参考
[https://qiita.com/uhooi/items/a1a96a2d7f5e081e2049](https://qiita.com/uhooi/items/a1a96a2d7f5e081e2049)
[https://qiita.com/uhooi/items/c77a53a4c7ac232a1ba1](https://qiita.com/uhooi/items/c77a53a4c7ac232a1ba1)

[https://github.com/terryyin/lizard](https://github.com/terryyin/lizard)