• 締切済み

テストの上手な書き方

暗号化、複合化するプログラムを作っています。 クラスには暗号化メソッドと復号化メソッドを作る予定です。 あるデータを暗号化して復号化したら元のデータに戻っていることをテストしたいです。 単体テストはどのように書くのがいいのでしょうか? 復号化メソッドのテストの中で暗号化メソッドを使ってしまうと、どちらのメソッドのテストだかわからなくなってしまうし、復号化メソッドの中でテストデータとして暗号文を使うには、暗号化メソッドを先に実装して暗号文を計算させなくてはいけなくなってしまいます。。

みんなの回答

回答No.1

・暗号化を先に実装して、理論上の暗号化結果と一致するかを検証 ・複合化メソッドは暗号化入力前の値に戻るかを検証 または、 ・暗号&複合をひとつの機能としてみて、入出力が一致するかを検証 どちらにしても暗号化入力部分のケース毎の総当りは必須なので、暗号化を主軸に考えるのが良いのではと思います。

okonekat
質問者

お礼

回答ありがとうございます。遅くなってしまってすみません。

okonekat
質問者

補足

補足です、今回TDDです。テストファーストでブラックボックステストでユニットテストです。 暗号化関数は共通鍵暗号や乱数生成器、ハッシュ関数などの既存のライブラリを組み合わせて実装する予定です。 > 暗号化を先に実装して、理論上の暗号化結果と一致するかを検証 理論上の暗号化結果を手計算で求めるのはとても大変なので、手計算の結果のほうがテスト対象より信頼できません。 かといってコンピュータで計算すると、計算式がプログラムそのものになってしまいます。 > 複合化メソッドは暗号化入力前の値に戻るかを検証 テスト時に復号化メソッドに与える暗号文を、信頼出来るライブラリを使って作ることができるなら良いと思いますが、暗号化メソッドの値を使ってしまうのはテストが予想外に失敗する可能性があると思います。 >暗号&複合をひとつの機能としてみて、入出力が一致するかを検証 そのテストケースはどのような位置に書くのがベストですか? 例えば、暗号化のメソッドだけに関するテストケースで、「入力に対してこのような長さのデータが帰ってくる」というテストケースも書きたいとき、それのテストと暗号&複合のテストは同列に扱うべきですか?それとも暗号&複合のテストに含まれる暗号の長さのテストと考えたほうがいいですか?

関連するQ&A

  • RSA暗号

    どのトピックかがいまいちわからないのでこのトピックに質問を載せさせて頂きます。 いま、大学の課題でRSA暗号をパソコンで実装する という課題に取り組んでいます。 2桁以上の素数を選んで、その素数から暗号化鍵と復号化鍵を選んでアスキーコードを暗号化するという初歩的なものなので、実用性は全くありませんが… プログラムはできたのですが 暗号化鍵と復号化鍵を生成して 暗号化を行って複合化を行うと 元の平文に戻らない鍵のペアがあるらしいのです。 そういうときってあるのでしょうか?

  • Access内の汎用モジュールにパスワードを平文(テキスト)で記載し、

    Access内の汎用モジュールにパスワードを平文(テキスト)で記載し、プログラムから利用しています。 単独使用なら平文で問題ないのですが、開発者も含め複数利用時にソース開くことでパスワードが漏れるのは困ります。 そこで、平文のパスワードを暗号化したいと考えました。 暗号化されたパスワードはソースを見ただけでは、元の平文のパスワードが何か分かりません。 しかし、プログラムから暗号化されたパスワードを復号化する際のメソッドを見れば、開発者は元の平文のパスワードが分かります。 メソッドにキーを与えないと復号化できないようにし、キーはバイナリで深い階層に沈めれば、直ぐには開発者でも平文のパスワードが分からない気がします。 VBAで書ける、このような方法を簡単に実装するものはありますでしょうか?もしくは良いフリーソフトもしくはシェアウェアはありますでしょうか?他の方法でも問題が解決すればOKです。 図解も含めてみました。つたない説明ですみませんが、どなたかお助け下さい。

  • 抽象クラスをJUNITでテストする方法

    抽象クラス内に実装メソッドと抽象メソッドがある場合に、 そのクラスをJUNITでテストしたいと思っています。 通常のクラスであれば、そのクラスに対するテストクラスを 作成して、テストクラス内でテスト対象クラスをnewして テストケースを記述していくと思いますが、 上記のような抽象クラスの場合は、 どういった形でテストクラスを作成すれば良いのでしょうか? 抽象クラスはnewできないので、 抽象クラスを実装したクラスをまず作成して そのクラスに対するテストクラスを作成するのでしょうか? お薦めの方法や一般的な方法があれば教えてください。 以上、よろしくお願い致しますm(__)m 【環境】 JDK1.4.2 JUNIT3.8.1

    • ベストアンサー
    • Java
  • 「単体テスト」に関する深刻な愚問です。

    「プログラム内のロジックの網羅性」という表現が【単体テスト】の説明文の中に登場していたのですが、意味合いが全く解説されていなかったものですから、畏れ入りますが、その意味を教えて頂けませんでしょうか?

  • PHPUnitを使った逐一実行プログラムのテスト方

    今とあるバッチのテストをしようと考えています。 バッチの処理としては、DBから必要なデータを取ってきて(クラスを使っています)、そのデータを元にPEAR::HTTP_Requestクラス使ってGETリクエストを送信するようなものです。 そもそもテストというものに関してド素人なのでよくわかっていないのですが、こういったプログラムをPHPUnitを使ってテストすることは可能なのでしょうか。 出来ればDBからデータ取ってくる部分と、HTTP_Requestクラス使ってGETリクエストを投げる部分をモック化(?)して、これらの戻り値をこっちで制御していくつかのケースでテストしたいです。 テストの先頭で、requireで読み込んだらファイルが実行されてしまうし、execなどを使ってもプログラム内のクラスをモック化する方法が分かりません。 長くなりましたが、聞きたい事としては、こういった逐一実行するようなプログラムのテストはPHPUnitを使ってテスト出来るものなのでしょうか。 また、PHPUnitを使ってテストする場合、テスト対象ファイルの内部で読み込まれたクラスをモック化するにはどうしたらよりのでしょうか。

    • ベストアンサー
    • PHP
  • privateのメンバ変数を直接取得するユーティリティ。

    privateのメンバ変数を直接取得するユーティリティ。 以前、あるプロジェクトでクラスのprivateメンバ変数をgetterメソッドがないのに直接取得できるクラスを使っているのを見ました。 オブジェクトとメンバ変数とかを引数に渡すと、Object型で返却されるようなテスト用のユーティリティクラスみたいでした。 クラスやパッケージなどを確認しなかったので、もしかしたらそのプロジェクトで独自に作ったのかもしれません。 ただオープンソースとかで存在するのであればテストに便利なので利用したいと考えています。 できればsetterメソッドがないprivateメンバ変数に設定できるクラスがあるとよいのですが・・・。 ご存知でしたら是非おしえてください。 希望している経緯はWebアプリケーションのクラスを作成すると、コンテナのオブジェクトがないと動かない場合も多く、単体試験がやりにくいのです。 easymockなど色々ありますが、生成したオブジェクトを対象クラスに渡してあげる必要があるものが多く(staticメソッドは対象外とか)、テストのためにsetterメソッドを実装する必要があります。 個人的には単体試験をやりやすくするために、本番では使用しないメソッドになるけれど、上記のようなsetterメソッドを作成するのはよいと考えています。 依存性を少なくさせて(意味が違うかもしれませんが)、試験がしやすくなれば保守性もあがるし、バグの発生率も少なくなると思っています。 ただ人によっては本番で動かないメソッドがあるのはおかしいという人もいます(実際に言われました)。 確かにそういう考えもあるかと思いますし、以前は私もそう思っていました。 試験のためのメソッドをクラスに作成する考えについても(主にテスト用なのでprotectedで作成しています)、やめた方がいいなどのアドバイスを頂けると嬉しいです。

    • ベストアンサー
    • Java
  • デジカメプリントに持ち込むCD

    自己複合型暗号つまりパスワードをかけたデータでもプリント可能なのでしょうか? 会社のパソコンに保存されている写真データをCDに書き出し、カメラ屋さんにあるセルフデジカメプリント機で印刷しようと思うのですが、会社のパソコンは自己複合型暗号(ファイルの暗号化処理を行う際にパスワードを設定して暗号化を行い、パスワードを入力することにより復号化を行う方式)でしか外部記録媒体にデータを書き出すことができないのです。

  • ■テキストを暗号化・複合化できるソフトを探しています。(windows

    ■テキストを暗号化・複合化できるソフトを探しています。(windows版) テキストデータの暗号化について お願いいたします。 (1)暗号化したいテキストと暗号化キーを入力、複数の暗号化方式を選択して暗号化できるもの。 (2)逆に、暗号化キーと暗号化テキストを入力して、複数の暗号化方式で 復号できるもの があればと思います。よろしくお願いいたします。

  • PerlのサブルーチンからのリターンをHTMLに取り込む方法はありますか?

    現在構築しているサイトで、暗号化されたcookieをBASE64を利用して復号化し、その中から一部のデータを取り出してCookieにセットしなければなりません。 利用者にボタンを押下させたり、リンクをクリックさせたりすることなく、あるURLにアクセスしてくると自動的に上記のようなCookieの復号化とセットが実行されるようにしたいと思っています。 私が考える限り、以下のような方法が思いつくのですが、どちらが一番現実的で実装可能でしょうか。また、これらによる実装が無理な場合、他にどのような方法があるでしょうか。 1.HTMLからPerlで実装したcgiを実行し、復号化させたデータを<meta>タグの中で content="xxxx"としてCookieにセットする。ただし、HTMLからどのように呼び出せばよいのかわからず困っています。 試しに、a.cgiというPerlで復号化およびデータの切り出しを実装してみたのですが、どのように記述すればHTMLからそれが呼び出されるのかわからず困っています。また、ユーザの環境ではPerlは実行できませんのでこの方法の場合は、a.cgiはサーバで実行させたいです。 2.上記1が無理な場合、javascriptで復号化しセットする処理を記述する。ただし、この場合、どうすればBASE64で復号化できるのかわかりません。 www.tohoho-web.com などを参考にさせていただきましたが、javascriptはBASE64は扱えないのでしょうか。 3.上記1の中で記述したa.cgiを、切り出したデータを返すようにするのではなく、Cookieをセットするように改良してHTMLから呼び出す。ただし、利用者の操作なしで実行させる方法がわかりません。 長文失礼しました。お知恵を拝借させてください。

  • 暗号文の質問です

    暗号文をつくろうとしてつくったのですが、 暗号文をつくることはできたのですが 暗号を元に戻す操作のプログラムを作るのができません。 本のヒントで暗号化を行うか、復号化を行うかはプログラムの開始時点で整数値を入力することにより指定(0を入力すると暗号化、1を入力すると復号化)するらしいです。なんかうまくいかないので教えてもらえるとうれしいです。 #include<stdio.h> int main(void) { char line[100]; int ix; while(gets(line) !=NULL) { ix =0; while(line[ix] !='\0') { if(line[ix]>='A'&&line[ix]<='Y' || line[ix]>='a'&&line[ix]<='y') line[ix] ++; else if(line[ix]=='Z'|| line[ix]=='z') line[ix] =25; ix++; } printf("%s\n",line); } }