TestRailに乗り換えて1年：Excelからの移行で見えたメリットと使い勝手

はじめまして！
これまで長年にわたりExcelの表計算ソフトを使用して試験書を作成していましたが、1年前からTestRailの利用を開始しました。この記事では、ExcelからTestRailへの移行経験をもとに、両システムの機能の違いや使い勝手についての率直な感想をお伝えします。
Excelでのテスト管理からTestRailへの移行を検討中の方にとって、役立つ情報を提供できればと思っております。

# TestRailでは、どうやって試験書を記載していくのか？

1.ダッシュボードの[＋プロジェクトの追加]ボタンでプロジェクトを追加します。Excelで言うとフォルダ作成に相当します

![比較１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828745/a60b9d58-210c-1352-ac8b-ec189a1f8cc8.png)

2.作成したプロジェクトの「テストケース」タブをクリックして、テスト内容を記載します。Excelで言うとファイル作成に相当します

![比較２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828745/6c2768ee-2f5e-25d4-8548-96378da8cc68.png)

3.「テストケース」タブの右上に表示されている[▶テストランの追加]ボタンをクリックして、試験する内容を設定します。Excelで言うと試験書ファイルを共有フォルダに公開してユーザーに試験を依頼する流れになります

![比較３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828745/e31f6373-3d15-5310-f5f0-7c308fd0bf65.png)

4.「テストケースと結果」タブをクリックすると作成したテストランが表示されるので、該当の項目をクリックして試験を実施します。Excelで言うと共有フォルダから試験書をダウンロードして、ファイルを開いて試験を実施する流れになります

![比較４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828745/053bca3b-864e-898d-f1ee-df0a9b18841f.png)

5.試験タイトルをクリックして、[＋結果の追加]ボタンをクリックすることで、試験時のメモや画像ファイル、ログファイルといったエビデンスを登録できます。Excelでは、競合しないよう結果をExcelファイルに記載して、エビデンスは共有フォルダにキャプチャやログを格納する流れになると思います

![比較5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828745/b3725dca-a82c-0602-f3f3-3abe1def4f61.png)

Excelと比較すると、TestRailでどのように試験を実施していくかがイメージできたかと思います。
TestRailは、外部ツール（Redmine、Jira）と連携できるので、不具合が発生したら自動で外部ツールに通知する設定も可能です。（設定したことはありません(´^ω^｀汗)）

# TestRailとExcelどっちがいいの？

結局、TestRailと表計算ソフト(Excel)どちらがいいのか？
表で比較してみました。

| 比較内容 | TestRail | 表計算ソフト(Excel) |
|:-----------|:------------|:------------|
| テストケース管理 | WEB上で管理します | ローカル環境、共有フォルダ、外部ツール(Git、SVN)などで管理します |
| 外部ツールとの連携機能 | Redmine、Jira などと連携して、テスト結果を通知することができます | 主にデータのインポートとエクスポートに使われます |
| 共有操作 |  WEB上で共有操作します | 共有ファイルに設定することで、共有操作できますが、処理が重く、タイムラグが発生します |
| テスト結果の分析 | テスト結果をグラフなどを使用して分析した結果を画面上に表示してくれます。※これは非常に便利です | 分析機能なし(※1) |
| マクロ、関数式 | 機能なし | 機能あり |
| 年間ライセンス料 | 有料(※2) | ソフトによるが、ほぼ無料(※3) |
| ネットワーク環境 | 必要 | 単体ソフトウェアなら不要です(※4) |

※1：テスト結果を分析する機能は無いが、マクロや関数式を使用することで分析結果を表示するシートを作成することができる。（ただし、作成コストが掛かり、セルの選択ミスなどにより計算の不一致問題が発生する可能性があります）
※2：機能が制限されているProfessional Serverの場合は、1年当たり8,140ドル(約1,139,600円)です。全ての機能が使用できるEnterprise Serverの場合は、1年当たり16,500ドル(約2,310,000円)です。（20のユーザーまで使用可能で20ユーザー以上使用する場合は＋オプション料金が必要になります）
※3：Office365は、年間ライセンス料が必要ですが、多くの企業がこのサービスを利用しているので、追加料金が発生しないという意味です。
※4：単体ソフトウェアのExcelならネットワークが無くても操作することができます。（Office365、Googleスプレッドシートはネットワーク環境が必要になります）

# 結論

TestRailの導入にはコストがかかります。
試験管理にコストをかける価値があるかどうかで決定されるかと思います。

コストをかけることが可能な企業にとっては、TestRailへの移行で以下の問題が解消されるため、試しに投入してみるのも面白いかと思います。

---

・試験書、どこに置いているの？
　⇒　すみません。ローカルに置いていました。
・最新の試験書はどれ？
　⇒　多分…　これだと思います。（すみません。違いました。）
・今どこまで試験が終わっているの？
　⇒　チームの進捗状況を集計してから報告します。

TestRailでは、最新の試験書や進捗状況をブラウザ上ですぐに確認することができます。

---

・GitまたはSVNで試験結果を共有ファイルにコミットすると、エラーが発生し、他のユーザーとのファイル競合が発生してマージが必要になったなど…
　⇒　結果を書いたのに！最新のファイルを取得して書き直しになりました。または、試験結果が上書きされて消えたなど…

TestRailはブラウザ上での共有操作のため、競合やマージの心配はありません。
Excelを共有操作に設定したときのようなタイムラグや表示更新待ちといった問題を感じることなく操作できます。

---

・試験結果の確認で、エビデンスはどれですか？
・納品後に問題が発生、ちゃんとテストしましたか？その時の結果とエビデンスはどれですか？
　⇒　すみません、エビデンスを探していますが、見つかりません。

TestRailでは、試験ごとに結果の「メモ」や「ファイル（画像・ログ）」をアップロードすることができ、TestRailによる試験結果の細かい分析が可能です。
試験ごとに結果（エビデンス）を登録しているので、問題発生時には試験の結果をすぐに見つけて報告することができます。

## TestRailのデメリット

TestRailは試験管理ツールとして非常に優れていますが、いくつかのデメリットも存在します。

 1. コスト : TestRailの最大のデメリットは、コストがかかることです
 2. 複雑な表の作成が困難 : TestRailでは基本的な表は作成可能ですが、試験マトリクスのような複雑で細かい表を作成するのは難しいです
 3. 不具合の影響 : [TestRailの不具合](https://docs.testrail.techmatrix.jp/testrail/docs/801/defect_information/)の影響を受けることがある点です

【2024年7月11日確認 ： 不具合について】 
特に、日本語入力時に文字を変換しEnterキーを押すと文字が自動で改行される問題は、多くの日本人ユーザーにとって使いづらい不具合となっています。不具合が修正されるまでの間、この問題に対する一時的な対策方法を以下に記載します。同様の問題に直面している方々の参考になればと思います。

## TestRailの不具合

### 文字変換によるEnterキーで自動改行される問題について　（2024年7月11日 確認）

Chromeブラウザを使って、TestRailにて試験書を記載するときに文字を入力してEnterキーにて変換すると文字が自動で改行されます。
Safariブラウザでは、文字が自動改行されることはありませんが、変換後の文字の後ろに改行文字が登録されています。なので、文字列の中で文字を変換すると、変換した後の文字が改行されます。

不具合が直るまでの対策としてChrome拡張機能を使って改行文字を削除する設定を行います。
使用するのは　「[Violentmonkey](https://chromewebstore.google.com/detail/violentmonkey/jinjaccalgkegednnccohejagnlnfdag)」というChromeの拡張機能になります。

#### 設定手順について

1. Chromeの拡張機能に「Violentmonkey」を追加します

2. Chromeの右上に「Violentmonkey」アイコンが登録されるのでアイコンをクリックして、[＋]ボタンでスクリプトを新規作成する画面を表示します

3.「コード」タブに以下のコードを追加し、[保存]ボタンをクリックします
※注意：// @match https://✕✕✕✕.✕✕✕✕.com/* の内容はご自身のTestRailのURLに置き換えてください。

```

// ==UserScript==
// @name         TestRail
// @namespace    Violentmonkey Scripts
// @match        https://✕✕✕✕.✕✕✕✕.com/*　　※ここの内容をご自身のTestRailのURLに置き換えてください。
// @version      0.1
// @description  Prevents newline on IME conversion
// @author       Your Name
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const TARGET_CLASSES_LIST = [
        ['form-control', 'steps-editor', 'content', 'field-editor', 'ui-autocomplete-input'],
        ['form-control', 'steps-editor', 'expected', 'field-editor', 'ui-autocomplete-input']
    ];

    function copyStyles(fromElement, toElement) {
        const computedStyle = window.getComputedStyle(fromElement);
        for (const key of computedStyle) {
            toElement.style[key] = computedStyle.getPropertyValue(key);
        }
    }

    function replaceDivWithTextarea(div) {
        var textarea = document.createElement('textarea');
        textarea.style.width = div.offsetWidth + 'px';
        textarea.style.height = div.offsetHeight + 'px';
        textarea.value = div.innerHTML.replace(/<br>/g, '\n');
        textarea.className = div.className;
        copyStyles(div, textarea);
        div.parentNode.replaceChild(textarea, div);
        textarea.addEventListener('blur', function() {
            replaceTextareaWithDiv(textarea);
        });
        textarea.focus();
    }

    function replaceTextareaWithDiv(textarea) {
        var div = document.createElement('div');
        div.style.width = textarea.style.width;
        div.style.height = textarea.style.height;
        div.innerHTML = textarea.value.replace(/\n/g, '<br>');
        div.className = textarea.className;
        div.setAttribute('contenteditable', 'true');
        textarea.parentNode.replaceChild(div, textarea);
        div.addEventListener('focus', function() {
            replaceDivWithTextarea(div);
        });
    }

    function addFocusListener(element) {
        const matchesAnyClassList = TARGET_CLASSES_LIST.some(classList =>
            classList.every(cls => element.classList.contains(cls))
        );
        if (matchesAnyClassList) {
            element.addEventListener('focus', function() {
                replaceDivWithTextarea(element);
            });
        }
    }

    TARGET_CLASSES_LIST.forEach(classList => {
        const selector = '.' + classList.join('.');
        var targetElements = document.querySelectorAll(selector);
        targetElements.forEach(function(element) {
            addFocusListener(element);
        });
    });

    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            mutation.addedNodes.forEach(function(node) {
                if (node.nodeType === 1) {
                    addFocusListener(node);
                    TARGET_CLASSES_LIST.forEach(classList => {
                        const selector = '.' + classList.join('.');
                        node.querySelectorAll(selector).forEach(addFocusListener);
                    });
                }
            });
        });
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();

```

上記の設定により、「前提条件」の内容以外は自動改行されない設定になります。

# おわりに

長々と読んで頂き、ありがとうございました。
個人的な意見も多く含まれていますが、少しでもお役に立てればと思います。
以上、よろしくお願いいたします。