通常JUnitでは1クラスに対して1クラス分のテストケースクラスを作成してテストを実施します。何らかの業務でプロジェクト全体での規模になってくるとその数は何十、何百、時には何千となる事も珍しいことではありません。
こういったプロジェクトでソースに何らかの修正が入り、テストを実施するという場合に1つずつJUnitで確認していたのでは実行するだけで無駄に時間が掛かってしまいます。
こういう場合には「テスト・スイートクラス」を作成して、まとめて実行して確認するのが一般的な手法となります。
環境
pleiades(eclipse4.2)
junit_4.10.0
テスト・スイートクラスの作成手順
- テストケースクラスが保存されているパッケージで右クリックし、「新規」⇒「その他」を選択します。
- ウィザード画面で「JUnit」⇒「JUnitテスト・スイート」を選択し「次へ」ボタンを選択します。
- テストスイートクラスのファイル名(デフォルトではAllTestsとなります)、保存先のフォルダ、テストしたいクラスを設定し、「完了」ボタンを選択します。
- 上記手順で以下の様なテスト・スイートクラスが作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({ OverLoadSampleTest.class, OverRideSampleTest.class, SampleClass1Test.class, UtilClassDjUnitTest.class, UtilSample1Test.class, UtilSample1TestDjunit.class }) /** * <p>[概 要] コンストラクタ</p> * <p>[詳 細] テスト・スイートクラスのコンストラクタ。</p> * <p>[備 考] </p> */ public class AllTests { } |
djUnitではメソッドが呼び出された際、強制的に特定のExceptionを発生させる事も可能です。強制的にExceptionを発生させる場合には「addReturnValue」を使用します。
1点注意しておきたいのは「addReturnValue」を使用してExceptionを発生させた時はjunitで「@Test(expected = RuntimeException.class)」の様にアノテーションでは確認出来ないのでTry~catchで確認する必要があります。
Javaソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
/** * <p>[概 要] URLエンコード処理</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param str 文字列 * @param enc - 文字コード * @return URLエンコード後の文字列 */ public static String urlEncode(String str, String enc){ String urlEncode = ""; StringBuffer result = new StringBuffer(); try { urlEncode = URLEncoder.encode(str, enc); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.toString()); } // 半角スペースは「%20」へ置換する for(char c : urlEncode.toCharArray()) { switch (c) { case '+' : result.append("%20"); break; default : result.append(c); break; } } return result.toString(); } |
djUnitサンプル
以下のテストソースでは「URLEncoder」クラスの「encode」メソッドが呼び出された際に「UnsupportedEncodingException」がスローされた事を確認しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
@Test public void testUrlEncode_exception() { // 準備 String str = "/&<>\"\' abc123"; String enc = "utf-8"; // 「URLEncoder.encode()」を実行した際、UnsupportedEncodingExceptionを発生させます。 addReturnValue(URLEncoder.class, "encode", new UnsupportedEncodingException("MESSAGE001")); try { // 実行 UtilSample1.urlEncode(str, enc); fail("この行は、実行されないはず"); } catch (Throwable t) { assertTrue(t instanceof RuntimeException); assertEquals("java.io.UnsupportedEncodingException: MESSAGE001", t.getMessage()); } } |
TeraTermが日本語表示されない場合の対処方法についてメモしておきます。
事象
TeraTermを起動すると以下の様にメニュー等の表示が英語になっている。
原因
対応方法
- TeraTermのインストールフォルダ内にある「TERATERM.INI」ファイルをエディタで開きます。
- 次に「TERATERM.INI」ファイル内で「UILanguageFile=」と記載されている箇所を探します。
日本語表示されていない場合は以下の様に「UILanguageFile=」の後に何も記載されていません。
|
; User interface language file that includes message strings. ; Tera Term uses built-in English message when the file or message is not found. UILanguageFile= |
- 「UILanguageFile=」の箇所を「UILanguageFile=lang\Japanese.lng」に変更してINIファイルを保存します。
|
; User interface language file that includes message strings. ; Tera Term uses built-in English message when the file or message is not found. UILanguageFile=lang\Japanese.lng |
- 後はTeraTermを起動すれば日本語化されます。
SQLで1つの項目に対して複数の値に一致した条件で検索する方法をご紹介します。
この場合、考えられる方法としては「OR」演算子を使用する方法と「IN」演算子を使用する2つの方法があります。
通常はIN演算子で済むような条件であればOR演算子は使用しません。
サンプルテーブル
以下の商品テーブル「goods」を元に説明します。
商品テーブル「goods」 |
|
1つの項目に対して複数の値で検索
SQL:「OR」演算子を使用する場合
「OR」演算子を使用する場合、以下の様にWHERE句にOR演算子を指定する事で複数の値で検索する事が出来ます。
「SELECT * FROM [テーブル名] WHERE [条件1] OR [条件2];」形式で記述します。
|
SELECT * FROM goods WHERE type_code = 101 OR type_code = 102; |
SQL:「IN」演算子を使用する場合
「IN」演算子を使用する場合、以下の様にWHERE句にIN演算子を指定する事で複数の値で検索する事が出来ます。
「SELECT * FROM [テーブル名] WHERE [列名] IN ([値1], [値2] …;」形式で記述します。
|
SELECT * FROM goods WHERE type_code IN(101, 102); |
実行結果
「OR」演算子、「IN」演算子どちらで実行した場合も取得結果は以下の様になります。
SQLで範囲検索する方法をご紹介します。
サンプルテーブル
以下の商品テーブル「goods」を元に説明します。
商品テーブル「goods」 |
|
単純なレコード件数の取得
SQL
SQLはWHERE句にBETWEEN演算子を指定する事で範囲検索結果が取得出来ます。
「SELECT * FROM [テーブル名] WHERE [列名] BETWEEN [From値] AND [To値];」形式で記述します。
|
SELECT * FROM goods WHERE type_code BETWEEN 102 AND 103; |
実行結果
JUnitで使用可能なアノテーションの種類についてまとめておきます。
環境
JUnit 4.10で使用できるアノテーション
アノテーション | 用途 |
@Before | メソッド単位で事前実行する |
@BeforeClass | テストクラスで一回だけ事前実行 |
@After | メソッド単位で事後実行する |
@AfterClass | テストクラスで一回だけ事後実行 |
@Rule | テスト時における一時的なルールの作成 |
@ClassRule | 複数のテストを通じてのルール設定 |
@Test | テストメソッドの指定 |
@Ignore | 一時的にテスト対象外メソッドを指定 |
SQLでテーブルのレコード数を取得する方法をご紹介します。
サンプルテーブル
以下の商品テーブル「goods」を元に説明します。
商品テーブル「goods」 |
|
単純なレコード件数の取得
SQL
SQLは
「SELECT COUNT(*) FROM [テーブル名];」形式で記述します。
|
SELECT COUNT(*) FROM goods; |
実行結果
重複データを除いたレコード件数の取得
SQL
重複データを除いて取得する場合、SQLは
「SELECT COUNT(DISTINCT [列名]) FROM [テーブル名];」形式で記述します。
|
SELECT COUNT(DISTINCT type_code) FROM goods; |
実行結果
業務でSQLを使用する場合、必ず使用する事になると言って良いのがテーブルの結合処理です。WEB系システムの場合、そのほとんどはRDBMSを使用してますのでテーブルが一つだけなどという事はまずありえません。複数のテーブルからその時々に応じて必要なデータを取得し使用するのが常です。その際に重要になるポイントの一つが内部結合と外部結合です。
サンプルテーブル
以下の商品テーブル「goods」と属性コードテーブル「type_code」を元に説明します。
商品テーブル「goods」 | 属性コードテーブル「type_code」 |
| |
内部結合とは
- 2つのテーブルで一致したデータ行のみ取得します。
- SQLは「SELECT * FROM [テーブル名1] INNER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- サンプルSQL
|
SELECT goods.type_code, goods.name, type_code.code_name FROM goods INNER JOIN type_code ON goods.type_code = type_code.code; |
サンプルSQLの実行結果
外部結合とは
- 2つのテーブルで一致しないデータも含めてどちらか一方のテーブルのデータを全て取得します。
- SQLは左外部結合の場合、「SELECT * FROM [テーブル名1] LEFT OUTER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- SQLは右外部結合の場合、「SELECT * FROM [テーブル名1] RIGHT OUTER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- サンプルSQL(左外部結合の場合)
|
SELECT goods.type_code, goods.name, type_code.code_name FROM goods LEFT OUTER JOIN type_code ON goods.type_code = type_code.code; |
サンプルSQLの実行結果
このサイトにも記事を書く際に画像を添付する事が多いのですが、「画像の形式ってjpgとpngどっちがいいんだろう・・・」と思いながらも適当に使っていたのでその辺を整理しておこうと思います。他にはgifなどもありますが今はあまり使用される事は少ないでしょうからjpgとpngについてのみまとめておきます。
jpgの特徴
- 写真やグラデーションのある画像など色数が多い画像の場合の保存に適しています。
- 透明/半透明の画像は扱えません。
- 高画質でファイルサイズが小さくなります。
- 画質が必ず劣化します。
pngの特徴
- PC画面のキャプチャやイラストなど色数が少ない画像の場合の保存に適しています。
- 透明/半透明の画像が扱えます
- ファイルサイズが大きくなりやすい。ただしキャプチャなどのシンプルな画像の場合はjpgよりファイルサイズが小さくなります。
- 画質が全く劣化しません。
「駑馬十駕」 IT系情報を中心に調べた事をコツコツ綴っています。