SimpleTest 1.0.1betaを試す: ファイルアップロードのテスト

動機

SimpleTestの次期バージョン1.1でファイルアップロードのテストができるようになることを知りました。しかし、待ちきれませんでした。調査してみる価値はあると思い、ちょっと頑張ってみることにしました。

メーリングリストの調査

SimpleTestの開発元のメーリングリストに対して「file upload」というキーワードで検索すると、ファイルアップロードのテストに関する議論のやり取りをしているメールが見つかりました。その中でも、特に注目すべきメールはこれです。実装例が示されています。このメールを参考にして、サンプルコードを書いてみようと思ったのでした。

CVSからのチェックアウト

そこで、SimpleTestの最新のCVSリポジトリからソースをチェックアウトしてみました。何の問題もなくチェックアウトできました。「VERSION」ファイルを見ると1.0.1betaであることがわかります。

$ mkdir simpletest_cvs
$ cd simpletest_cvs
$ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/simpletest login
[Press Enter key]
$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/simpletest co -P simpletest
$ cat simpletest/VERSION
1.0.1beta

ディレクトリ構成

作成したサンプルのディレクトリ構成は以下の通りです。ちなみに、treeコマンドを使うとファイルのリストアップが綺麗にできるのでお勧めです。-Fオプションと一緒に使うと「ls -F」と同じような効果が得られます。

$ tree -F
.
|-- file.upload.test.php
|-- form.html
|-- sample.txt
|-- save_file.php
|-- simpletest/
|   |-- CVS/
|   |   |-- Entries
|   |   |-- Repository
|   |   `-- Root
|   |-- HELP_MY_TESTS_DONT_WORK_ANYMORE
[...]
`-- uploaded/

The Code

今回コードの中で、核になる部分のコードを以下に示します。これまでのWebTestCaseの使い方と同じようにコーディングすればOKでした。

$ cat file.upload.test.php
<?php
require_once('simpletest/web_tester.php');
require_once('simpletest/reporter.php');

class WebTests extends WebTestCase {
        function testFileUpload() {
                $upload_file = "sample.txt";
                $path = "./uploaded/$upload_file";

                $this->get('http://localhost/simpletest_cvs/form.html');
                $this->assertRealm('xxxx');
                $this->authenticate('user', 'pass');
                $this->showHeaders();
                $this->assertTitle('File upload test');

                $this->setField("file", $upload_file);
                $this->clickSubmitByName("upload");

                $this->assertWantedPattern("/upload ok/");
                $this->assertTrue(file_exists($path));

                $lines = file($path);
                $this->assertTrue(ereg('Can you read this message\?', $lines[0]));

                unlink($path);
        }
}

$test = &new WebTests();
$test->run(new HtmlReporter());
?>

このコードではBasic認証も突破できるようにしてあります。ファイルが本当に期待どうりアップロードできているかどうかを確かめるために、ファイルの内容もチェックするようにしてみました。
このコードを実行させると、期待通りファイルのアップロードのテストが実行されていることが確認できました。今の1.0.1betaでも一応、動作するんですね。

Miscellaneous

これ以降には、それほど重要ではないけれども、核になるコードを理解するために必要なコードを示します。

ファイルのアップロードをする何の変哲もないフォームです。

$ cat form.html
<html>
<head><title>File upload test</title></head>
<body>
        <form enctype="multipart/form-data" action="save_file.php" method="post">
                <input type="hidden" name="MAX_FILE_SIZE" value="100000">
                <input type="file" name="file">
                <input type="submit" name="upload" value="upload">
        </form>
</body>
</html>


アップロードに利用するファイルです。

$ cat sample.txt
Can you read this message?


ファイルの保存処理を行うコードです。form.htmlからアップロードされたファイルをuploadedディレクトリに保存し、ブラウザに正常に処理が完了したかどうかを単に返しているだけです。何も難しいことはしていません。

$ cat save_file.php
<?php
print_r($HTTP_POST_FILES);
$tmp_name = $HTTP_POST_FILES['file']['tmp_name'];
$filename = $HTTP_POST_FILES['file']['name'];

if (is_uploaded_file($tmp_name)) {
        move_uploaded_file($tmp_name, "./uploaded/" . $filename);
        print "upload ok";
} else {
        print "error";
}
?>

さいごに

ファイルのアップロードのテストがSimpleTestで行えるようになれば、本当に便利になりそうです。次期バージョン1.1が早くリリースされますように。