LSUnit v0.2

LSUnitはLotus NotesでLotus Scriptのユニットテストを行うためのテスティングフレームワークです。

著作権は作者にあります。ご使用に関してはこちらの使用許諾契約を一読願います。

更新履歴

2012/7/5 公開場所を移動Lycos⇒オブラブ 2002/5/6 v0.2公開
2001/7/2 v0.1公開

動作環境

Lotus Notes R4.6.7
Windows98/2000
上記の環境にて動作を確認しています。
その他の動作環境について、報告していただけるとうれしいです。

ダウンロード

インストール方法

ここでの説明は、R4.6.7を対象に書いています。

lsunitxx.lzhをダウンロードします。xxにはバージョン番号が入ります。
ダウンロードしたファイルをディレクトリ付きで解凍します。
ファイルを解凍すると以下のファイルがあります。
index.html・・・このファイル
libDialog.lss・・・ダイアログ表示ライブラリ
libLSUnit.lss・・・LSUnitライブラリ
libProgressBar・・・プログレスバー表示ライブラリ
libScriptLibraryList・・・スクリプトライブラリ情報ライブラリ
libStringUtil.lss・・・サンプルライブラリ
libStringUtil_Test.lss・・・サンプルライブラリのテスト
libStringUtilFail_Test.lss・・・サンプルライブラリのテスト
libStringUtilNull_Test.lss・・・サンプルライブラリのテスト
testLSUnit.lss・・・サンプルエージェント
TestRunner.lss・・・テスト実行用のエージェント
images・・・画像ファイル用のディレクトリ

libDialogの登録
(1)メニューより[作成]−[設計]−[スクリプトライブラリ]を選択し、コード編集ペインを開きます。
(2)メニューより[ファイル]−[呼び出し]を選択し、ファイル選択ダイアログボックスで、解凍したlibDialog.lssを呼び出します。
(3)ファイルの呼び出しオプションのダイアログボックスが表示されますので、[すべて]を選択してください。
(4)[編集]−[プロパティ]を選択して、スクリプトライブラリのプロパティウィンドウを表示します。
(5)ライブラリ名に「libDialog」と入力して保存してください。
(6)libDialogを利用するには、特別なフォームが必要です。2つのフォームを作成します。
(7)「MULTISELECT」フォームを作成します。
(7-1)メニューより[作成]−[設計]−[フォーム]を選択し、フォーム編集ペインを開きます。
(7-2)メニューより[作成]−[レイアウト領域]−[作成]を選択し、レイアウト領域を作成します。
(7-3)レイアウト領域をクリックしてアクティブにした状態で、メニューより[作成]−[フィールド]を選択します。作成されたフィールドのプロパティ等を設定します。
フィールド名「PROMPT」
種類「テキスト」「計算結果」
Value「PROMPT」
(7-4)レイアウト領域をアクティブにした状態で、フィールドを追加し、プロパティを設定します。
フィールド名「SELECTED」
種類「キーワード」「編集可能」
選択「式を使用して入力」「SELECTED」
複数値も可にチェック
(7-5)レイアウト領域の下をクリックし、レイアウト領域を非アクティブにした状態で、フィールドを追加し、プロパティを設定します。
フィールド名「SELECTLIST」
種類「テキスト」「編集可能」
複数値も可にチェック

(8)「TEXT」フォームを作成します。
(8-1)メニューより[作成]−[設計]−[フォーム]を選択し、フォーム編集ペインを開きます。
(8-2)メニューより[作成]−[レイアウト領域]−[作成]を選択し、レイアウト領域を作成します。
(8-3)レイアウト領域をクリックしてアクティブにした状態で、メニューより[作成]−[フィールド]を選択します。作成されたフィールドのプロパティを設定します。
フィールド名「TEXT」
種類「テキスト」「編集可能」

libProgressBarの登録
(1)「libDialogの登録」の手順(1)〜(5)を参考に登録を行ってください。ファイル名は「libProgressBar.lss」、ライブラリ名は「libProgressBar」です。

libScriptLibraryListの登録
(1)「libDialogの登録」の手順(1)〜(5)を参考に登録を行ってください。ファイル名は「libScriptLibraryList.lss」、ライブラリ名は「libScriptLibraryList」です。

libLSUnitの登録
(1)「libDialogの登録」の手順(1)〜(5)を参考に登録を行ってください。ファイル名は「libLSUnit.lss」、ライブラリ名は「libLSUnit」です。

testRunnerの登録
(1)メニューより[作成]−[エージェント]を選択し、エージェント作成ペインを開きます。
(2)各種情報を設定します。
名前「TestRunner」
共有エージェントにチェック
指定したエージェントの実行時期「エージェントリストから手動で」
実行する文書「@コメント使用時に1回実行」
エージェントの実行内容「スクリプト」
(3)コード編集ペインをクリックしてアクティブにします。メニューより[ファイル]−[呼び出し]を選択し、ファイル選択ダイアログボックスで、解凍したTestRunner.lssを呼び出します。ファイルの呼び出しオプションのダイアログボックスが表示されますので、[すべて]を選択してください。
(4)保存します。

マクロボタンの登録
この作業はオプションですが、これを行っておくと開発時の効率がアップします。
(1)メニューより[ファイル]−[ツール]−[スマートアイコン]を選択します。

(2)左のアイコン一覧から好きなマクロボタンを右側にドラッグ&ドロップします。
(3)右側でドロップしたアイコンを選択し、[編集]ボタンをクリックします。

(4)[式]ボタンをクリックします。

(5)式テキストボックスに「@Command([ToolsRunMacro]; "(TestRunner)")」と入力します。

これで、LSUnitのインストール作業は終了です。

サンプルプログラムの実行
サンプルプログラムはエージェントとして作成します。
メニューより[作成]−[エージェント]を選択します。
エージェントの設定は、
名前:testLSUnit
共有エージェントにチェック
指定したエージェントの実行時期「エージェントリストから手動で」
実行する文書「@コマンド使用時に1回実行」
とします。
エージェントの実行内容で、「スクリプト」を選択します。
メニューより[ファイル]−[呼び出し]を選択し、ファイル選択ダイアログボックスで、解凍したtestLSUnit.lssを呼び出します。
ファイルの呼び出しオプションのダイアログボックスが表示されますので、[すべて]を選択してください。
保存してください。
[表示]-[エージェント]で、エージェントリストを表示します。
作成したエージェントを選択して、[アクション]-[実行]で、実行します。以下のようなログ画面が表示されればインストールは成功です。

LSUnit入門

LSUnitはテスト対象コードがスクリプトライブラリに保存されていることを前提に作成されています。
TestCaseの各メソッドについてはリファレンスを参照してください。

ステップ1:簡単なテストを作成する。

新しいエージェントを作成し、エージェントの設定を以下のようにします。
名前:testSample
共有エージェント:チェックする
指定したエージェントの実行時期:エージェントリストから手動で
実行する文書:@コマンドの使用時に1回実行
実行:スクリプト

イベントのOptionで、元々あった
Option Public
を削除します。そして次の2行を追加します。
Option Explicit
Use "libLSUnit"
1行目は、変数の宣言を強制するための宣言文です。Option Declareと同等です。
2行目は、インストールしたLSUnitライブラリを利用するための宣言文です。

イベントのDeclarationsに以下のテストケースのコードを追加します。
Public Class Test1 As TestCase
Public Sub runTest()
Call Me.assertEqualsString("A", Ucase("a"))
End Sub
End Class
1行目は、TestCaseクラスを継承して、新規のテストケースを宣言します。
2行目は、テストランナーから呼び出されるメソッドです。
3行目は、TestCaseクラスのAssertEqualsStringメソッドを呼び出しています。

イベントのInitializeメソッドに以下のテストケース実行のコードを追加します。
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
Sub Initialize
     Dim result As TestResult
     Dim tr As TestRunner
     Dim tc As TestCase

     Set tc = New Test1()
     Set tr = New TestRunner(tc)
     Set result = New TestResult()
     Call tr.run(result)
End Sub

2行目は、TestResult型の変数を宣言しています。
3行目は、TestRunner型の変数を宣言しています。
4行目は、TestCase型の変数を宣言しています。
6行目は、TestCase型の変数に、TestCase型の派生クラスである先程作成したテストケースのクラスTest1のインスタンスを作成してその参照を格納しています。
7行目は、テストケースを実行するためのテストランナーを作成しています。
8行目は、テスト結果を格納するためのオブジェクトを作成しています。
9行目は、テストランナーの実行をしています。
保存します。

エージェントリストを表示し、(testSample)を選択して実行します。
エージェント testSample の 2002/05/06 19:13:03 での実行が終了しました
2002/05/06 19:13:03: SUCCESS!!
Tests Run: 1, Asserts: 1, Failures: 0, Errors: 0, Time elapsed: 0 sec
ロータス スクリプトを実行しました
エージェント testSample の実行が終了しました(2002/05/06 19:13:03)
と表示されれば、このサンプルは成功です。


ステップ2:失敗してみる

イベントのDeclarationsに以下のテストケースのコードを追加します。
Public Class Test2 As TestCase
Public Sub runTest()
Dim dblCount As Double
For dblCount = 0 To 1 Step 0.001
Doevents
Next
Call Me.assertEqualsDouble(1, dblCount, 0)
End Sub
End Class

イベントのInitializeを以下のように変更します。
06: Set tc = New Test1()
変更後
06: Set tc = New Test2()

実行します。
エージェント testSample の 2002/05/06 19:16:28 での実行が終了しました
2002/05/06 19:16:28: [TEST2]expected<1> was <1>
FAILURE!!
Tests Run: 1, Asserts: 1, Failures: 1, Errors: 0, Time elapsed: .006 sec
ロータス スクリプトを実行しました
エージェント testSample の実行が終了しました(2002/05/06 19:16:28)
と表示されれば、このサンプルは成功です。
2行目では、1になるはずなのに1だよと意味不明のことを言っているようにみえますが、これは浮動小数点演算につきものの誤差でただprintしただけでは分からないエラーを的確に捉えて警告してくれています。


ステップ3:エラーを出してみる

イベントのDeclarationsに以下のテストケースのコードを追加します。
Public Class Test3 As TestCase
Public Sub runTest()
Dim intResult As Integer
intResult = 1 / intResult
End Sub
End Class

イベントのInitializeを以下のように変更します。
06: Set tc = New Test2()
変更後
06: Set tc = New Test3()

実行します。
エージェント testSample の 2002/05/06 19:19:24 での実行が終了しました
2002/05/06 19:19:24: [TEST3][Err:11][Erl:166] D007 ゼロで除算しました
ERROR!!
Tests Run: 1, Asserts: 0, Failures: 0, Errors: 1, Time elapsed: 0 sec
ロータス スクリプトを実行しました
エージェント testSample の実行が終了しました(2002/05/06 19:19:24)
と表示されれば、このサンプルは成功です。
2行目で、実行時エラーが発生したのを捉えています。手動のテストだとエラーが発生した時点で、バグを直してから再度実行ということが多いかと思いますが、LSUnitはエラーが出ても、可能な限り実行するようになっています。


ステップ4:複合テストを作成する

ステップ1から3で作成したテストケースを連続して実行するようにします。

イベントのInitializeメソッドを以下のテストケース実行コードにします。
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Sub Initialize
     Dim result As TestResult
     Dim tr As TestRunner
     Dim ts As TestSuite
     Dim tc As TestCase

     Set ts = New TestSuite()
     Set tc = New Test1()
     Call ts.addTest(tc)
     Set tc = New Test2()
     Call ts.addTest(tc)
     Set tc = New Test3()
     Call ts.addTest(tc)

     Set tr = New TestRunner(ts)
     Set result = New TestResult()
     Call tr.run(result)
End Sub
4行目、TestCaseの組を扱うためのTestSuite型の変数を宣言しています。
7行目、TestSuite型のインスタンスを作成します。
9行目、11行目、13行目、TestSuite型にTestCaseを追加します。
15行目、テストケースの組を実行するためのテストランナーのインスタンスを作成します。
保存します。

実行します。
エージェント testSample の 2002/05/06 19:23:21 での実行が終了しました
2002/05/06 19:23:21: [TEST2]expected<1> was <1>
[TEST3][Err:11][Erl:166] D007 ゼロで除算しました
FAILURE!!
Tests Run: 3, Asserts: 2, Failures: 1, Errors: 1, Time elapsed: .02 sec
ロータス スクリプトを実行しました
エージェント testSample の実行が終了しました(2002/05/06 19:23:21)
と表示されれば、このサンプルは成功です。

ステップ5:テストを連続して行う

テストケースが増えてきて、その中からいくつかを連続して行うのに、それぞれのエージェントを実行していたのでは効率が悪いだけではなく、テストの漏れが発生してしまう可能性が多くなります。
そこで、表示されたテストケースからテストを行いたいものを複数選択し、実行する方法を説明します。

まず、サンプルプログラムを登録し、ためしに動かしてみましょう。
解凍したファイルの中にある、「libStringUtil.lss」「libStringUitl_Test.lss」「libStringUitlFail_Test.lss」「libStringUitlNull_Test.lss」をこの順でライブラリに登録します。
エージェントリストを表示し、「(TestRunner)」を選択し、実行すると、以下のようなダイアログが表示されます。インストール時にマクロボタンを登録されていれば、そのボタンを押せばこの画面が表示されます。

テストを選択します。ここでは、3つとも選択してください。選択したら[OK]ボタンをクリックします。以下の画面が表示されれば成功です。

このようにテストを行うには、ちょっとした決まりごとに従ってプログラミングをする必要があります。
(1)テストケースはスクリプトライブラリに作成する。
(2)スクリプトライブラリ名は「xxx_Test」とする。
スクリプトライブラリにある「xxx_Test」という名前のライブラリが、テスト選択画面にリストアップされます。
(3)テストクラスは「TestCase」クラスを直接継承する。
(4)テストクラスは「Public」とする。
「Public Class xxxx As TestCase」いう名前のクラスが、実行されるようになっています。
この2つの規則を守れば、この機能を使って一括してテストを行うことが出来ます。


今後の予定

リフレクションを使ってtestXXXをテスト対象にするようにしたいけど・・・

その他

バグや、改善要望等がありましたら
@amapyon
まで、連絡を下さい。
ソースコードに手を加えたら、それを送っていただけると嬉しいです。


使用許諾契約

この契約は、LSUnitを被契約者に対して、下記条項に基づいた使用権を許諾するものです。

使用

被契約者は、LSUnitを自由に使用することができます。

配布

LSUnitを改変する、しないに関わらず自由に再配布することができます。配布物には、本使用許諾契約を含める必要があります。

免責

著作権者は、LSUnitを使用した結果、または使用できなかった結果被ったいかなる損害についても責任を負いません。

Copyright (C) 2001-2002 amapyon, All rights reserved.


リファレンス

setTraceMessage(strTraceMessage As String)

失敗や、エラーがあったときに表示するメッセージを設定します。

getTraceMessage() As String

失敗や、エラーがあったときに表示するメッセージを取得します。

crearTraceMessage()

失敗や、エラーがあったときに表示するメッセージをクリアします。

assertTrue(Byval condition As Integer)

True(非0)である。

assertFalse(Byval condition As Integer)

False(0)である。

assertNull(Byval condition As Variant)

Nullである。

assertNotNull(Byval condition As Variant)

非Nullである。

assertEmpty(Byval condition As Variant)

未定義である。

assertNotEmpty(Byval condition As Variant)

定義済みである

assertNothing(Byval condition As Variant)

オブジェクトのインスタンスがない。

assertNotNothing(Byval condition As Variant)

オブジェクトのインスタンスがある。

assertEqualsVariant(Byval expected As Variant, Byval actual As Variant)

2つの変数が同値である。

assertEqualsString(Byval expected As String, Byval actual As String)

2つの文字列型(String)変数が同値である。

assertEqualsLong(Byval expected As Long, Byval actual As Long)

2つの長整数型(Long)変数が同値である。
整数型(Integer)変数の場合もこのメソッドを利用してください。

assertEqualsDouble(Byval expected As Double, Byval actual As Double, Byval delta As Double)

2つの倍精度型(Double)変数の差が、誤差の範囲である。
単精度型(Single)変数の場合もこのメソッドを利用してください。

assertEqualsDate(Byval expected As Variant, Byval actual As Variant)

2つの日付型の日付部分が同値である。

assertEqualsTime(Byval expected As Variant, Byval actual As Variant)

2つの日付型の時刻部分が同値である。

assertEqualsDateTime(Byval expected As Variant, Byval actual As Variant)

2つの日付型の日付部分と時刻部分が同値である。