テストドキュメンテーションの自動化という夢想

テストのドキュメントを自動生成したい。ユニットテスト・フレームワーク一覧を探したけど、よさそうなのがない。希望としては

  • 単体テスト、総合テストでも使える
  • HTMLで出力する
  • 結果の一覧を確認できる
  • テストの手順を出力できる

こんな感じで

サマリ表示

詳細表示

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=CP932"/>
    <title>Testing Summery</title>
    <link rel="stylesheet" href="style.css" type="text/css" />
  </head>
  <body id="top">
    <h1>1. Test Overview</h1>
    <table  border="1">
      <tr>
        <th>Project</th>
        <td>Test Project</td>
      </tr>
      <tr>
        <th>Sub Project</th>
        <td>Sub Test Project</td>
      </tr>
      <tr>
        <th>Module</th>
        <td>Module Name</td>
      </tr>
      <tr>
        <th>Sub Module</th>
        <td>Sub Module Name</td>
      </tr>
      <tr>
        <th>Test Date</th>
        <td>2012-03-04
        </td>
      </tr>
    </table>
    <br/>
    <h1>2. Test Result</h1>
    <h2>2.1. Functional Requirement</h2>
    <table  border="1">
      <tr>
        <th>1st Category</th>
        <th>2nd Category</th>
        <th>3rd Category</th>
        <th>ID</th>
        <th>Description</th>
        <th>Count</th>
        <th>Pass</th>
        <th>Result</th>
        <th>Comment</th>
      </tr>
      <tr>
        <td rowspan="5">Function A1</td>
        <td rowspan="2">Sub-Func A1</td>
        <td>Sub-Sub A1</td>
        <td>
          <a href="detail.html#a1-1-1">a1-1-1</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>Sub-Sub A2</td>
        <td>
          <a href="detail.html#a1-1-2">a1-1-2</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td rowspan="3">Sub-Func A2</td>
        <td>Sub-Sub A1</td>
        <td>
          <a href="detail.html#a1-2-1">a1-2-1</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>Sub-Sub A2</td>
        <td>
          <a href="detail.html#a1-2-2">a1-2-2</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>Sub-Sub A3</td>
        <td>
          <a href="detail.html#a1-2-3">a1-2-3</a>
        </td>
        <td>Description XXX</td>
        <td>2</td>
        <td>1</td>
        <td class="NG">NG</td>
        <td>Comment1</td>
      </tr>
      <tr>
        <td rowspan="5">Function A2</td>
        <td rowspan="2">Sub-Func A1</td>
        <td>Sub-Sub A1</td>
        <td>
          <a href="detail.html#a2-1-1">a2-1-1</a>
        </td>
        <td>Description YYY</td>
        <td>3</td>
        <td>3</td>
        <td>OK</td>
        <td>Comment2</td>
      </tr>
      <tr>
        <td>Sub-Sub A2</td>
        <td>
          <a href="detail.html#a2-1-2">a2-1-2</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td rowspan="3">Sub-Func A2</td>
        <td>Sub-Sub A1</td>
        <td>
          <a href="detail.html#a2-2-1">a2-2-1</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>Sub-Sub A2</td>
        <td>
          <a href="detail.html#a2-2-2">a2-2-2</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>Sub-Sub A3</td>
        <td>
          <a href="detail.html#a2-2-3">a2-2-3</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
    </table>
    <p>Pass/Total = 4/5 = 80.00%</p>
    <h2>2.2. Non-Functional Requirement</h2>
    <table  border="1">
      <tr>
        <th>1st Category</th>
        <th>2nd Category</th>
        <th>3rd Category</th>
        <th>ID</th>
        <th>Description</th>
        <th>Count</th>
        <th>Pass</th>
        <th>Result</th>
        <th>Comment</th>
      </tr>
      <tr>
        <td rowspan="5">Function B1</td>
        <td rowspan="2">Sub-Func B1</td>
        <td>Sub-Sub B1</td>
        <td>
          <a href="detail.html#b1-1-1">b1-1-1</a>
        </td>
        <td>Description ZZZ</td>
        <td>1</td>
        <td>1</td>
        <td>OK</td>
        <td>Comment3</td>
      </tr>
      <tr>
        <td>Sub-Sub B2</td>
        <td>
          <a href="detail.html#b1-1-2">b1-1-2</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td rowspan="3">Sub-Func B2</td>
        <td>Sub-Sub B1</td>
        <td>
          <a href="detail.html#b1-2-1">b1-2-1</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>Sub-Sub B2</td>
        <td>
          <a href="detail.html#b1-2-2">b1-2-2</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>Sub-Sub B3</td>
        <td>
          <a href="detail.html#b1-2-3">b1-2-3</a>
        </td>
        <td><br/></td>
        <td>0</td>
        <td>0</td>
        <td class="None">--</td>
        <td><br/></td>
      </tr>
    </table>
    <p>Pass/Total = 1/1 = 100.00%</p>
    <h2>2.3. Performance Measurement</h2>
    <p>TBD</p>
    <a href="detail.html">Go to detailed</a>
    <a href="#top">Go to top</a>
  </body>
</html>

detail.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=CP932"/>
    <title>Test Detailed Results</title>
    <link rel="stylesheet" href="style.css" type="text/css" />
  </head>
  <body id="top">
    <h1 id="a1-2-3">1. Test ID a1-2-3</h1>
    <h2>1.1. Test Case Infomation</h2>
    <table  border="1">
      <tr>
        <th>ID</th>
        <td>a1-2-3</td>
      </tr>
      <tr>
        <th>Classify</th>
        <td>Function A1/Sub-Func A2/Sub-Sub A3</td>
      </tr>
      <tr>
        <th>Description</th>
        <td>Description XXX</td>
      </tr>
      <tr>
        <th>Condition</th>
        <td>Cond</td>
      </tr>
      <tr>
        <th>Valid</th>
        <td>Valid</td>
      </tr>
      <tr>
        <th>Note</th>
        <td>Note</td>
      </tr>
    </table>
    <br/>
    <h2>1.2. Test Pattern</h2>
    <table  border="1">
      <tr>
        <th>No.</th>
        <th>Pattern</th>
        <th>Note</th>
      </tr>
      <tr>
        <td>1</td>
        <td>Pattern1</td>
        <td>Note1</td>
      </tr>
      <tr>
        <td>2</td>
        <td>Pattern2</td>
        <td>Note2</td>
      </tr>
    </table>
    <br/>
    <h2>1.3. Test Steps</h2>
    <table  border="1">
      <tr>
        <th>Step</th>
        <th>Process</th>
        <th>Expect</th>
        <th>Result</th>
        <th>Note</th>
      </tr>
      <tr>
        <td>1</td>
        <td>Process 1</td>
        <td>Expect 1</td>
        <td>OK</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>2</td>
        <td>Process 2</td>
        <td>Expect 2</td>
        <td class="NG">NG</td>
        <td><br/></td>
      </tr>
    </table>
    <br/>
    <h1 id="a2-1-1">2. Test ID a2-1-1</h1>
    <h2>2.1. Test Case Infomation</h2>
    <table  border="1">
      <tr>
        <th>ID</th>
        <td>a2-1-1</td>
      </tr>
      <tr>
        <th>Classify</th>
        <td>Function A2/Sub-Func A1/Sub-Sub A1</td>
      </tr>
      <tr>
        <th>Description</th>
        <td>Description YYY</td>
      </tr>
      <tr>
        <th>Condition</th>
        <td>Cond</td>
      </tr>
      <tr>
        <th>Valid</th>
        <td>Valid</td>
      </tr>
      <tr>
        <th>Note</th>
        <td>Note</td>
      </tr>
    </table>
    <br/>
    <h2>2.2. Test Pattern</h2>
    <table  border="1">
      <tr>
        <th>No.</th>
        <th>Pattern</th>
        <th>Note</th>
      </tr>
      <tr>
        <td>1</td>
        <td>Pattern1</td>
        <td>Note1</td>
      </tr>
      <tr>
        <td>2</td>
        <td>Pattern2</td>
        <td>Note2</td>
      </tr>
    </table>
    <br/>
    <h2>2.3. Test Steps</h2>
    <table  border="1">
      <tr>
        <th>Step</th>
        <th>Process</th>
        <th>Expect</th>
        <th>Result</th>
        <th>Note</th>
      </tr>
      <tr>
        <td>1</td>
        <td>Process 1</td>
        <td>Expect 1</td>
        <td>OK</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>2</td>
        <td>Process 2</td>
        <td>Expect 2</td>
        <td>OK</td>
        <td><br/></td>
      </tr>
      <tr>
        <td>3</td>
        <td>Process 3</td>
        <td>Expect 3</td>
        <td>OK</td>
        <td><br/></td>
      </tr>
    </table>
    <br/>
    <h1 id="b1-1-1">3. Test ID b1-1-1</h1>
    <h2>3.1. Test Case Infomation</h2>
    <table  border="1">
      <tr>
        <th>ID</th>
        <td>b1-1-1</td>
      </tr>
      <tr>
        <th>Classify</th>
        <td>Function B1/Sub-Func B1/Sub-Sub B1</td>
      </tr>
      <tr>
        <th>Description</th>
        <td>Description ZZZ</td>
      </tr>
      <tr>
        <th>Condition</th>
        <td>Cond</td>
      </tr>
      <tr>
        <th>Valid</th>
        <td>Valid</td>
      </tr>
      <tr>
        <th>Note</th>
        <td>Note</td>
      </tr>
    </table>
    <br/>
    <h2>3.2. Test Pattern</h2>
    <table  border="1">
      <tr>
        <th>No.</th>
        <th>Pattern</th>
        <th>Note</th>
      </tr>
      <tr>
        <td>1</td>
        <td>Pattern1</td>
        <td>Note1</td>
      </tr>
      <tr>
        <td>2</td>
        <td>Pattern2</td>
        <td>Note2</td>
      </tr>
    </table>
    <br/>
    <h2>3.3. Test Steps</h2>
    <table  border="1">
      <tr>
        <th>Step</th>
        <th>Process</th>
        <th>Expect</th>
        <th>Result</th>
        <th>Note</th>
      </tr>
      <tr>
        <td>1</td>
        <td>Process 1</td>
        <td>Expect 1</td>
        <td>OK</td>
        <td><br/></td>
      </tr>
    </table>
    <br/>
    <a href="index.html">Go to index</a>
    <a href="#top">Go to top</a>
  </body>
</html>

style.css

th {
    background-color : PaleGreen;
    text-align       : left;
}

td.NG {
    background-color : Red;
    font-weight      : bold;
}

td.None { background-color : Yellow; }

h1 {
    border-top       : 4px solid Blue;
    border-bottom    : 1px solid Blue;
    background-color : SkyBlue;
    color            : Blue;
}

h2 {
    border-top  : 1px solid Black;
    color       : Black;
    font-weight : bold;
}