私はこれまで、さまざまな理由でユニットテストを書いたことがありません。私は一から作成する小さなアプリを持っているので、今、快適にテストを書く機会があります。この状況でユニットテストをどのように適用しますか?
しかし、私は少し困惑しています。アプリケーションは、スマートカードリーダーを備えたプリンターを使用してスマートカード上のデータをプログラムすることになっています。ここでは、デバイスコンテキストの作成、プリンタモードの設定、ドキュメントの初期化、プリンタへのカードのフィード、リーダによるカードへの接続、カードへの何かの書き込み、カードの取り出し、ドキュメントの終了、デバイスコンテキスト。
さて、単体テストは各テストごとに1つの関数をテストし、各テストは他のテストの結果とは独立して実行されるはずです。しかし、見てみましょう - 私はそれがプリンタに正しく配置されていない場合、私はそれに接続していない場合、スマートカードへの書き込みをテストすることはできません。実際のカードが正しく配置されて接続されていれば、実際に書き込みが行われたかどうかをテストすることしかできません。カードへの接続が失敗すると、カードへの書き込みをテストする方法がないので、テストの独立性の原則は破られます。
は、これまでのところ私はこのようなテストを思い付いた
[Test]
public void _WriteToSmartCard()
{
//start print job
printer = new DataCardPrinter();
reader = new SCMSmartCardReader();
di = DataCardPrinter.InitializeDI();
printer.CreateHDC();
Assert.AreNotEqual(printer.Hdc, 0, "Creating HDC Failed");
Assert.Greater(di.cbSize, 0);
int res = ICE_API.SetInteractiveMode(printer.Hdc, true);
Assert.Greater(res, 0, "Interactive Mode Failed");
res = ICE_API.StartDoc(printer.Hdc, ref di);
Assert.Greater(res, 0, "Start Document Failed");
res = ICE_API.StartPage(printer.Hdc);
Assert.Greater(res, 0, "Start Page Failed");
res = ICE_API.RotateCardSide(printer.Hdc, 1);
Assert.Greater(res, 0, "RotateCardSide Failed");
res = ICE_API.FeedCard(printer.Hdc, ICE_API.ICE_SMARTCARD_FRONT + ICE_API.ICE_GRAPHICS_FRONT);
Assert.Greater(res, 0, "FeedCard Failed");
bool bRes = reader.EstablishContext();
Assert.True(bRes, "EstablishContext Failed");
bRes = reader.ConnectToCard();
Assert.True(bRes, "Connect Failed");
bRes = reader.WriteToCard("123456");
Assert.True(bRes, "Write To Card Failed");
string read = reader.ReadFromCard();
Assert.AreEqual("123456", read, "Read From Card Failed");
bRes = reader.DisconnectFromCard();
Assert.True(bRes, "Disconnect Failde");
res = ICE_API.SmartCardContinue(printer.Hdc, ICE_API.ICE_SMART_CARD_GOOD);
Assert.Greater(res, 0, "SmartCardContinue Failed");
res = ICE_API.EndPage(printer.Hdc);
Assert.Greater(res, 0, "End Page Failed");
res = ICE_API.EndDoc(printer.Hdc);
Assert.Greater(res, 0, "End Document Failed");
}
テストが働いている
(「適切」であり、あまりにも他のものをテストし、他のテストもあります)が、原則は壊れている - それは複数の機能をテストし、多くの機能をテストします。それに続く各機能は、前の機能の結果に依存します。ここで、私たちは、このような状況で単体テストにどのようにアプローチすればよいのでしょうか。
C#ラッパーにアクセスする可能性はありますか? VB6とC++のコードに頼っていますが、同じことをやっています。より良いIDEとフレームワークですべてをやり遂げることが大好きです。 – fuzz