S2では、データベースに対するテストも簡単に行えるような仕組みを用意しております。
それでは、さっそく例を見てみましょう。 SQL文を発行するためのフレームワークとしてS2ADOを使います。
Select文に対するテスト
今回は、従業員を従業員番号で検索するDAOをサンプルにします。シナリオとして従業員番号で検索をかけると、
従業員番号9900の従業員テーブルと部署番号99の部署テーブルをジョインして返す想定とします。
このケースをテストするためには、検索のための従業員テーブルと部署テーブルのデータを検索した結果を検証するためのデータが必要です。
データはExcelで用意します。シート名がテーブル名で、シートの第1行にカラム名を2行目以降にデータを書き込みます。
1から手でデータを作成してもいいのですが、ここでは既存のテーブルのデータを利用してテストデータを作成します。
セットアップ-Examples を参照してデータベースを作成しておきます。
Seasar.Examplesにデータベースの内容をExcelに書き出すDb2ExcelClientが用意されているのでそれを使います。
Seasar/Examples/Reference/S2Unit/Db2ExcelClient.dicon
<components>
<include path="Seasar.Examples/Ado.dicon" />
<component name="Db2ExcelClient"
class="Seasar.Examples.Reference.S2Unit.Db2ExcelClient"/>
<component class="Seasar.Extension.DataSets.Impl.SqlReader">
<initMethod>self.AddTable("emp", "empno = 7788")</initMethod>
<initMethod>self.AddTable("dept", "deptno = 20")</initMethod>
</component>
<component class="Seasar.Extension.DataSets.Impl.XlsWriter"
instance="prototype">
<arg>"Seasar.Examples/Reference/S2Unit/GetEmployeePrepare.xls"</arg>
</component>
</components>
データベースの内容をDataSetに読み込んでくれるのがSqlReaderです。
AddTableの最初の引数はテーブル名(シート名)です。 2番目の引数は条件になります。
DataSetをExcelに書き出してくれるのがXlsWriterです。
コンストラクタでファイルのパスを指定します。パスは出力フォルダが基点になります。
Seasar/Examples/Reference/S2Unit/Db2ExcelClient
using System;
using Seasar.Extension.DataSets.Impl;
using Seasar.Framework.Container;
using Seasar.Framework.Container.Factory;
namespace Seasar.Examples.Reference.S2Unit
{
public class Db2ExcelClient
{
private const string PATH =
"Seasar.Examples/Reference/S2Unit/Db2ExcelClient.dicon";
public Db2ExcelClient() { }
public void Main()
{
IS2Container container = S2ContainerFactory.Create(PATH);
container.Init();
try
{
SqlReader reader = (SqlReader)
container.GetComponent(typeof(SqlReader));
XlsWriter writer = (XlsWriter)
container.GetComponent(typeof(XlsWriter));
writer.Write(reader.Read());
Console.Out.WriteLine(
"output Excel File : {0}", writer.FullPath);
}
catch (ApplicationException e)
{
Console.Out.WriteLine(e.Message);
}
}
}
}
IS2ContainerからSqlReaderを取り出しRead()、XlsWriterを取り出しWrite()するだけで、
データベースの内容をExcelに書き出すことができます。 Seasar.Examplesを起動し、
ツリーアイテムからS2Containerリファレンス-Select文に対するテスト(1)、
を選択すると Visual Studioの出力パス+指定パス(例:bin\Debug\Seasar.Examples\Reference\S2Unit)に
GetEmployeePrepare.xlsが作成されていることが確認できると思います。
GetEmployeePrepare.xlsをダブルクリックするとExcelが起動します。
empシートのEMPNOを9900、ENAMEをSCOTT2、DEPTNOを99に変更します。続いてdeptシートのDEPTNOを99、
DNAMEをRESEARCH2に変更します。これで検索用の元データは用意できます。Excelで保存を選び、終了します。
次に結果を検証するためのデータを用意します。
Seasar.Examplesに検証データを書き出すDb2ExcelClient2が用意されているのでそれを使います。
Seasar/Examples/Reference/S2Unit/Db2ExcelClient2.dicon
<components>
<include path="Seasar.Examples/Ado.dicon" />
<component name="EmployeeDaoTest"
class="Seasar.Examples.Reference.S2Unit.EmployeeDaoTest"/>
<component class="Seasar.Examples.Reference.S2Unit.EmployeeDao">
<property name="GetEmployeeHandler">
<component class="Seasar.Extension.ADO.Impl.BasicSelectHandler">
<property name="Sql">
"SELECT e.empno, e.ename, e.deptno, d.dname
FROM emp e, dept d WHERE e.empno = @empno AND e.deptno = d.deptno"
</property>
</component>
</property>
</component>
</components>
Seasar.Examplesを起動し、ツリーアイテムからS2Containerリファレンス-Select文に対するテスト(2)、
を選択すると Visual Studioの出力パス+指定パス(例:bin\Debug\Seasar.Examples\Reference\S2Unit)に
GetEmployeeResult.xlsを作成します。
先ほどと同様な手順でGetEmployeeResult.xlsのempシートのEMPNOを9900、ENAMEをSCOTT2、DEPTNOを99、
DNAMEをRESEARCH2に書き換えて保存します。これで、テスト用のデータがそろいました。いよいよテストに取り掛かります。
Seasar/Examples/Reference/S2Unit/EmployeeDao.dicon
<components>
<include path="Seasar.Examples/Ado.dicon" />
<component name="EmployeeDaoTest"
class="Seasar.Examples.Reference.S2Unit.EmployeeDaoTest"/>
<component class="Seasar.Examples.Reference.S2Unit.EmployeeDao">
<property name="GetEmployeeHandler">
<component class="Seasar.Extension.ADO.Impl.BasicSelectHandler">
<property name="Sql">
"SELECT e.empno, e.ename, e.deptno, d.dname
FROM emp e, dept d WHERE e.empno = @empno AND e.deptno = d.deptno"
</property>
</component>
</property>
</component>
</components>
Seasar/Examples/Reference/S2Unit/EmployeeDaoTest.cs
using System.Data;
using MbUnit.Core.Cons;
using MbUnit.Framework;
using Seasar.Extension.DataSets.Impl;
using Seasar.Extension.Unit;
namespace Seasar.Examples.Reference.S2Unit
{
[TestFixture]
public class EmployeeDaoTest : S2TestCase
{
private IEmployeeDao dao_ = null;
public void SetUpGetEmployee()
{
Include("Seasar.Examples/Reference/S2Unit/EmployeeDao.dicon");
}
[Test, S2(Tx.Rollback)]
public void GetEmployee()
{
ReadXlsWriteDb(
"Seasar.Examples/Reference/S2Unit/GetEmployeePrepare.xls");
Employee emp = dao_.GetEmployee(9900);
DataSet expected = ReadXls(
"Seasar.Examples/Reference/S2Unit/GetEmployeeExpected.xls");
S2Assert.AreEqual(expected, emp, "1");
}
public void Main()
{
using (MainClass mc = new MainClass())
{
mc.Main(new string[] { "Seasar.Examples.exe" });
}
}
}
}
Seasar.Examplesを起動し、ツリーアイテムからS2Containerリファレンス-Select文に対するテスト(3)、
を選択するとテストが実行されます。ここでは説明のためにコンソールから
MbUnitを実行していますが、
MbUnit.GUI.exeやTestDriven.NET
を使用したほうがテストしやすいでしょう。
SetUpGetEmployee()がapp.diconの役割を担います。S2Assert.AreEqual()でDataSetとIDictionary、IDictionaryのIList、object、objectのIList
と比較できるのですっきりとしたテストコードになります。
ReadXlsWriteDb()、ReadXlsAllReplaceDb()で、テストのために用意したデータをデータベースに格納します。
Excelのファイルがテストクラスと同じ名前空間にある場合は、名前空間部分のパスは省略できます。
(ただしビルドイベント等でアセンブリと同じフォルダにはき出す等の処理が必要です)
ReadXlsWriteDb()、ReadXlsAllReplaceDb()はテスト後にロールバックしてデータが元に戻るようにテストメソッドの最初に実行してください。
Daoを呼び出して取得したデータとReadXls()で読み込んだ結果検証用のExcelデータをS2Assert.AreEqual()に渡すと
Daoを呼び出して取得したデータがDataSetに変換され、結果検証用のExcelデータと比較します。