感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

テストのときに一時的なファイルを作成する

スポンサーリンク

たとえば、あるファイルを作成するクラスをJUnitでテストするときに、一時的なフォルダを用意して、テスト後にはきれいに消えていてくれたら嬉しい。

そうすると、テスト前後で環境は変わらないし、繰り返しテストを実行できるからだ。

JUnit4.7から、ユニットテストを拡張する機能として「ルール」が追加された。

ルールの辞書的な意味は以下のとおりである。

(社会・会などで秩序・機能を維持するため相互に守るべき)規則,規定

"ルール"はJUnitの拡張フレームワークで、ある決まった処理を行うときの規定を定義するために使う。
なんだか、「ルール」という単語にとらわれるとわけがわからなくなるけれど、個人的に解釈するならば、

「こんなんあったらいいね」という、テストに共通で使えそうな処理を、まとめたクラス

という印象だ。
「逆引きレシピ」には、

ルールとは、テストクラス感で共通した処理やテスト時の実行方法を定義するために、JUnit4.7から追加されたJUnitを拡張するための仕組み

と書いてある。

たとえば、JUnitが提供するルールには、
・TemporaryFolder
・ExternalResource
・Verifier
・ErrorCollector
・ExpectedException
・Timeout
・TestWatcher
・TestName

などがあって、たとえば、Timeoutなら、テスト時のタイムアウトを制御するルールを定義している。
以下の記事に詳しい。
http://www7b.biglobe.ne.jp/~archer/tryjunit4/tryjunit4Rules.html


今回は、ファイルを作成するメソッドのテストをするために、一時的なフォルダを用意する「ルール」を使ってみたい。

こんな感じの、ファイルを作成するクラスをテストする。

package sample;

import java.io.File;
import java.io.IOException;

public class Sample {

	public void createFile(String path) throws IOException {
		File file = new File(path);

		if (file.createNewFile()) {
			System.out.println("ファイルを作成しました");
		} else {
			System.out.println("ファイルは既に存在している");
		}
	}
}

テストクラスは以下のように書く。

package sample;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import java.io.File;
import java.util.Arrays;

import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class HogeTest {

	@Rule
	public TemporaryFolder tempFolder = new TemporaryFolder();

	@BeforeClass
	public static void setup() {
		System.setProperty("java.io.tmpdir","C:\\tmp");
	}

	@Test
	public void ファイルを作成するテスト() throws Exception {
		String testFolderName = "testFolder";

		File testFolder = tempFolder.newFolder(testFolderName);

		//こんなのができる→C:\tmp\junit825343523960238027\testFolder
		//テストが終わったら消える
		System.out.println(testFolder);

		Sample sample = new Sample();
		File folder = tempFolder.getRoot();

		//ファイルを作るメソッド
		sample.createFile(folder + "\\testFolder\\hoge.txt");
		sample.createFile(folder + "\\testFolder\\fuga.txt");

		//作ったファイルの一覧を取得する
		String[] actualFiles = testFolder.list();

		Arrays.sort(actualFiles);
		assertThat(actualFiles.length, is(2));
		assertThat(actualFiles[0], is("fuga.txt"));
		assertThat(actualFiles[1], is("hoge.txt"));

	}
}

環境はWindows。
テストを実行すると、一時的に、「junit825343523960238027」みたいなフォルダができる。
その中にファイルを作っても、テストが終わったら綺麗にしてくれる。

適当なファイルをこの一時フォルダに吐き出して、テスト実行。
テストが終わったら、フォルダごと綺麗にしてくれる、みたいな処理を「ルール」がやってくれる。

<参考文献>
JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

Java逆引きレシピ