イカ?スマートフォン用の表示で見るやらなイカ?たぶん、iOS/Androidアプリの開発・テスト関係。Toolsとして提供されています。Toolsは、これまでWindows版しかサポートされていませんでしたが、2019.3からはmacOS及びLinuxでも動作するようになりました。Toolsには、コードインスペクションツールであるInspectCodeのほかにも、重複コードを検出するdupFinder、コードクリーンナップを行なうCleanupCodeが含まれています。今回はInspectCodeのみ紹介します。Toolsは、上記サイトからプラットフォームを選んでダウンロードできます。無料で、ライセンスキーも不要です。ダウンロードしたzipファイルは、任意のディレクトリに展開するだけでokです。ターミナルで直接コマンド実行するのであればPATHを通しておくのも良いでしょう*1。CIサーバで実行するときにはあらかじめUnityエディタで生成しておく必要があります*2。InspectCodeの実行InspectCodeは、以下のように実行できます。Windowsの場合、inspectcode.shはinspectcode.exeに置き換えてください。Pluginなどで表示できます。引数に--format=htmlと指定することでhtml形式でも出力できます。インスペクション内容の設定InspectCodeがインスペクションしてくれる項目およびデフォルト設定は、下記ページにまとめられています。Rider設定をプロジェクトに合わせてカスタマイズするには、IDE(RiderおよびReSharper)のPreferencesの設定内容をファイル出力し、プロジェクトのルートに置くか、--profile引数でパスを渡します。ファイル出力には2種類の方法があります。team-shared"を選択します。このファイルをリポジトリに追加すれば、CIサーバでも同じ設定でインスペクションを実行できます。コンピュータの設定をエクスポートするすでに設定変更を"Save"ボタンで保存していた場合、それはプロジェクトでなくコンピュータ単位の設定ファイルに保存されています。これをエクスポートし、team-shared設定ファイルとして利用できます。Layersウィンドウを開きます。Fileウィンドウを開きます。ここでエクスポートする設定を選択できます。今回はコードインスペクション向けなので"CodeInspection"だけ選択していますが、他の設定もチームで共有したい場合はここで選択し、"OK"ボタンをクリックします。プラグインの追加InspectCodeには、.nupkg形式のプラグインを追加することができます。Toolsを展開したディレクトリに入れるだけで完了します。先日の記事で紹介した、コードの複雑度を測るプラグインも公開されています*3。2019.3.1で正しく動作しないようです。エラーも吐かれていないので設定まわりだと思うのですが、詳細未確認。plugins.jetbrains.comまとめインスペクションツールの実行はCIに頼るのでなく、IDEに備わっていることで問題の作り込みを早期に防ぐことができます。その点、RiderやReSharperを使い、かつ警告にきちんと対処していれば、内部品質の高い状態を維持できるはずです。プロジェクトの内部品質が低くなっている状態から改善していく場合など、CIでメトリクスを採取して変化を監視するのは有効です。導入を検討してみてください。2019のJetBrainsブースで「2020.x以降になるだろう」と伺っていたのですが、2019.3に前倒されました。IDEであるRiderには、様々なプラグインが提供されています。その中から、コードの複雑度を計測するプラグインを2つ紹介します。complexity)は循環的複雑度とも呼ばれ、コードの複雑さを測る指標としてよく使われます。メソッド単位に分岐によるパスの最大数を算出した数値で、一般に、32以上でバグ混入率が高い、50以上でテスト困難と言われています。WikipediaこれをRiderのインスペクションに組み込むプラグインがCyclomaticComplexityです。インストール・有効化できます。有効化すると、エディタのメソッド定義の上にサイクロマティック複雑度が表示されるようになります。上図では、サイクロマティック複雑度が29、Wariningとなるしきい値20(デフォルト値)に対して145%であると表示されています。既存プロジェクトで数値の高いメソッドが多い場合は、しきい値を緩めの値にして目立つものから少しづつリファクタリングを進めていくことをおすすめします。complexity)とは、2016年からSonarSource社*1が提唱している比較的新しい複雑度の指標です。循環的複雑度にならって日本語化するのであれば「認知的複雑度」でしょうか。understandabilitySonarSource社は、サイクロマティック複雑度では保守性を正しく数値化できておらず、その点を改善したものがコグニティブ複雑度であると書いています。サイクロマティック複雑度ではネストしたループとswitch-caseは同じスコアになりますが、後者のほうが理解しやすいコードのはずです。異常系の処理をif文で深くネストした中に書くよりも、メソッドの先頭でエラーチェックしてreturnしてしまうほうが読みやすくなります。そのため、分岐ではなく処理の流れを阻害する個所を加点することで保守性・可読性の評価につなげようというものがコグニティブ複雑度です。このコグニティブ複雑度をRiderのインスペクションに組み込むプラグインがCognitiveComplexityです。インストール・有効化できます。有効化すると、エディタのメソッド定義の上にコグニティブ複雑度が表示されるようになります。上図では、コグニティブ複雑度が23、Wariningとなるしきい値10(デフォルト値)に対して230%であると表示されています。クリックすることでコード内の加点された個所(上図ではif文の横にある"+1")を表示できます。既存プロジェクトで数値の高いメソッドが多い場合は、しきい値を緩めの値にして少しづつリファクタリングを進めていくことをおすすめします。スコープを指定して実行できます。Results"ウィンドウに表示されます。下に、サイクロマティック複雑度とコグニティブ複雑度それぞれ別に表示されます。thresholdなお、両方のしきい値を超えているメソッドは、コグニティブ複雑度にのみ表示されます。まとめ同じ目的を持つ2つのプラグインを紹介しましたが、いくつかのプロジェクトで見比べた感じ、コグニティブ複雑度のみ適用しておけばよさそうです。複雑度の高いメソッドは、条件の組み合わせも多くなりテストすることが難しく、バグも作り込まれやすくなります。プラグインを入れて数値を気にすることで、適切にメソッドを分割して保守性の高い状態をキープできるようになるでしょう。CyclomaticComplexityプラグインの存在はUnityゲーム開発者ギルドのSlackで知りました。役立つ情報を交換ができるコミュニティですので、Unityでゲームを開発している方は入ってみてはいかがでしょうか。IDEであるRiderには、テスト実行時にステートメントカバレッジを採取するdotCoverプラグインが提供されています。tests実行時のカバレッジを採取・表示できるようになりました。ライセンスが必要です(30日間の試用あり)。Editorパッケージの1.2.0以降が必要です。Managerでアップデートしてください。本稿では以下のバージョンで動作を確認しています。1.1.9カバレッジ採取の準備dotCoverプラグインでカバレッジを採取するには、以下の準備が必要です。起動するRiderでUnityテストを実行するにはUnityエディタとのコネクトが必要ですが、dotCoverを使用するときには通常とは異なる方法でコネクトします。ほかの方法で起動したUnityエディタとコネクトした状態でカバレッジを採取しようとすると、下図のアラートが表示されます*2。Mode"を選択した状態で実行する必要があります。testsのカバレッジは採取できません。カバレッジの採取カバレッジは、以下の手順でテスト実行することで採取できます。Modeテストを実行できます*3。Coverage"ウィンドウにステートメントカバレッジが表示されます。Coverage"ウィンドウでは、テスト対象のステートメント数と、テスト実行によって通過した/していないステートメント数、またその割合が確認できます。この状態でテスト対象ソースコードをエディタタブで開くと、通過した/していないステートメントを確認できます。25行目)は通過したステートメント、グレーでマークされた行(同22〜23行目)は通過していないステートメントです。ステートメントカバレッジの使いどころステートメントカバレッジとは、ユニットテストによってテスト対象コードの全ステートメントのうち何%がテストされているかを示すメトリクスです。命令網羅、C0とも呼ばれます。「カバレッジ」には、ほかに、デシジョンカバレッジ、条件カバレッジなどが使われます。テストケースが必要です。ステートメントが実行されたことは確認できますが、それが正しい実行結果であるかはアサーションで適切に判定されている必要があります。以上の観点から、ステートメントカバレッジは品質の指標として信頼度の高いものとは言えず、あくまで「めやす」くらいにとどめるのが良いでしょう。2019.2以降パッケージ化された名称。IDEであるRiderの2019.3がリリースされました。testsも実行できるようになりました。Modeも以下の手順で実行できます。Tests"ウィンドウに表示されます。Unityテスト実行の前提条件テストの実行はUnityエディタで行われるため、UnityエディタのプロセスとRiderとがコネクトされてる必要があります。Unityエディタとのコネクトは、Rider右下に表示されているアイコンで判断できます。下図、右から3つめのUnityロゴ右下にグリーンの丸が表示されていればコネクトされています。UnityエディタからRiderを開いた場合はコネクトされた状態のはずです。Process..."でコネクトできます。testsも、上記と同じ手順でテスト実行することができます。Mode"を選択した状態で実行する必要があります。run"と表示され、テスト実行されませんので注意してください。Mode"で実行しようとしても同様にテスト実行できません。Mode"を選択した状態で実行する必要があります。testsが実行できるようになったことは喜ばしいことです。testsの最大のメリットであるプレイヤー(iOSやAndroidの実機など)での実行ができるわけではありません。testsを中心に書いていくのがよいと考えています。選択すると、テストをデバッグ実行することができます。ブレイクポイント、ステップ実行、変数のインスペクションなども使用できます。アセットの自動リフレッシュを抑止するRiderのデフォルト設定では、テスト実行の都度、Unityエディタでアセットのリフレッシュが実行されます。開発を進める場合など、頻繁に待ち時間が発生してしまいますので、この設定をオフにすることもできます。チェックボックスをoffにします。2019.2以降パッケージ化された名称。2019の6日目の記事です。タイトルでお察しの通り、ネタエントリです。腰痛の原因には個人差があります。私の場合は同じ姿勢で座りっぱなしで、腰の一部の筋肉にずっと負荷をかけ続けてしまうことだと言われていて、以下のような緩和対策をしています。Watchの「スタンド」アクティビティが1時間ごとに立ち上がって歩くことを促してくれます。これは心臓疾患などのリスクを回避するためのものらしいのですが、私のケースでは腰痛の緩和にも寄与します。アラートに従えばの話。興が乗ってるとチラッと見て無視しますよね...モブプロそこでモブプロです!ここを読んでいる皆さんは御存知の通り、モブプログラミング(モブワーク)では数分単位でドライバーを交代していきますので、強制的に席を替わるために立ち上がって少し移動しなければなりません。座って再開するものの、ちょっと身体を動かすきっかけには十分ですね。いえ、ただちに「モブプロで腰痛緩和!」とまでは言えません。席移動しないでモニターだけ切り替える形式だと席移動は発生しませんし、席移動のたびに集中を切らしていては効率が悪くなってしまいそう。うまくモブプロに腰痛対策を組み込んでいければいいなと思っています。B(Unityトラック)にずっといました。以下、スライドは拾えたものだけ。Materialsで公開されるはずです。Codeデモアプリ等はここに。そんなものはないざっくりとした指針は示されているCAの図は、あくまで一例。Unityレイヤ定義Application:CAの文脈から外れる要素はここに置く。他から結構依存されるValueObjectマスタデータ用の型、enum状態管理、transactionInstallerZenjectのInstallerSignal抽象を用いないで制御を授受するための型。