テストは、意識しているかどうかに関係なく、Web アプリケーションを開発するときに常にテストを行っています。たとえば、PHP でクラスを作成する場合、インジェクション echo または die
ステートメントは、一連の複雑な HTML フォームを実装するときに、特定のメソッドが正しく実装されているかどうかを示します。Web ページを使用するときに、テスト データを入力しようとすることがあります。ページが期待どおりに動作するかどうかを確認するため、より上級の開発者は、このテスト プロセスを自動的に完了するコードを作成します。これにより、何かをテストするときは、コードを呼び出すだけで残りはコンピューターに任せることになります。これは自動テストと呼ばれ、この章の主要なトピックでもあります echo
或者 die
语句来显示我们是否正确地实现了某个方法;当我们实现了包含一套复杂的HTML表单的web页面时, 我们可能会试着输入一些测试数据来确认页面是否是按照我们的预期来交互的.更高级的开发者则会写一些代码来自动完成这个测试过程, 这样一来每当我们需要测试一些东西的时候, 我们只需要调用代码, 剩下来的就交给计算机了. 这就是所谓的 自动测试, 也是本章的主要话题.
Yii 提供的测试支持包括 单元测试 和 功能测试.
单元测试检验了代码的一个独立单元是否按照预期工作. 在面向对象编程中, 最基本的代码单元就是类. 因此, 单元测试的主要职责就是校验这个类所实现的每个方法工作都是正常的. 单元测试通常是由开发了这个类的人来编写.
功能测试检验了特性是否按照预期工作(如:在一个博客系统里的提交操作).与单元测试相比, 功能测试通常要高级一些, 因为待测试的特性常常牵涉到多个类. 功能测试通常是由非常了解系统需求的人编写.(这个人既可以是开发者也可以是质量工程师).
以下展示的便是所谓的 测试驱动开发 (TDD) 的开发周期:
创建一个涵盖要实现的特性的新的测试. 测试预计将在第一次执行的时候失败, 因为特性尚未实现.
执行所有测试,确保这个新的测试是失败的.
编写代码来使得测试通过.
执行所有测试,确保所有测试通过.
重构新编写的代码并确保这些测试仍然能够通过.
重复步骤1至5推进整体功能的实现.
Yii 提供的测试支持需要 PHPUnit 3.5+ 和 Selenium Remote Control 1.0+。(Linux中安装PHPUnit参考这篇文章:Ubuntu中安装PHPUnit的详细步骤及报错的解决办法,Windows中安装PHPUnit可参考这篇文章:在windows中安装Pear及PHPUnit详细教程,Selenium下载地址在这里:点击下载)
当我们使用 yiic webapp
控制台命令来创建一个新的 Yii 应用时, 它将会生成以下文件和目录供我们来编写和完成测试.
testdrive/ protected/ 包含了受保护的应用文件 tests/ 包含了应用测试 fixtures/ 包含了数据 fixtures functional/ 包含了功能测试 unit/ 包含了单元测试 report/ 包含了 coverage 报告 bootstrap.php 这个脚本在一开始执行 phpunit.xml PHPUnit 配置文件 WebTestCase.php 基于 Web 的功能测试基类
如上所示的, 我们的测试代码主要放在 fixtures
, functional
和 unit
这三个目录下, report
目录则用于存储生成的代码 coverage 报告.
我们可以在控制台窗口执行以下命令来执行测试(无论是单元测试还是功能测试):
% cd testdrive/protected/tests % phpunit functional/PostTest.php // 执行单个测试 % phpunit --verbose functional // 执行 'functional' 下的所有测试 % phpunit --coverage-html ./report unit
上面的最后一条命令将执行 unit
目录下的所有测试然后在 report
目录下生成出一份 code-coverage 报告. 注意要生成 code-coverage 报告必须安装并开启PHP的 xdebug 扩展 .
让我们来看看 bootstrap.php
文件里会有些什么. 首先这个文件有点特殊,因为它看起来很像是 入口脚本, 而它也正是我们执行一系列测试的入口.
$yiit='path/to/yii/framework/yiit.php'; $config=dirname(__FILE__).'/../config/test.php'; require_once($yiit); require_once(dirname(__FILE__).'/WebTestCase.php'); Yii::createWebApplication($config);
如上所示, 首先我们包含了来自 Yii 框架的 yiit.php
文件, 它初始化了一些全局常量以及必要的测试基类.然后我们使用 test.php
这个配置文件来创建一个应用实例.如果你查看 test.php
文件, 你会发现它是继承自 main.php
这个配置文件的, 只不过它多加了一个类名为 CDbFixtureManager 的 fixture
应用组件.我们将在下一节中详细的介绍 fixtures.
return CMap::mergeArray( require(dirname(__FILE__).'/main.php'), array( 'components'=>array( 'fixture'=>array( 'class'=>'system.test.CDbFixtureManager', ), /* 去除以下注释可为测试提供一个数据库连接. 'db'=>array( 'connectionString'=>'DSN for test database', ), */ ), ) );
当我执行那些涉及到数据库操作的测试时, 我们应该提供一个测试专用的数据库以便测试执行不会干扰到正常的开发或者生产活动. 这样一来, 我们纸需要去除上面 db
配置的注释, 然后填写 connectionString
単体テストは、独立したコード単位が期待どおりに動作するかどうかを検証します。オブジェクト指向プログラミングでは、コードの最も基本的な単位はクラスです。したがって、単体テストの主な役割は、このクラスによって実装された各メソッドが正常に動作するかどうかを検証することです。単体テストは通常、このクラスを開発した人によって作成されます。機能テストは、機能が期待どおりに動作するかどうかを検証します (ブログ システムでのコミット操作など)。テストされる機能には複数のクラスが含まれることがよくあります。機能テストは通常、システム要件をよく知っている人によって作成されます (この人は開発者または品質エンジニアのいずれかです)。
以下は、いわゆるテスト駆動開発 (TDD) の開発サイクルを示しています。
実装する機能をカバーする新しいテストを作成します。この機能はまだ実装されていないため、テストは最初の実行で失敗することが予想されます。
すべてのテストを実行して、この新しいテストが失敗することを確認します。
以下にコードを書き込みます。テストを合格させます。
yiic webapp
コンソール コマンドを使用して新しい Yii アプリケーションを作成すると、テストを作成して完了するために次のファイルとディレクトリが生成されます。はい、テスト コードは主に fixture
、function
、unit
の 3 つのディレクトリ、および report に配置されます。 code> ディレクトリ 生成されたコード カバレッジ レポートを保存するために使用されます。🎜🎜コンソール ウィンドウで次のコマンドを実行して、テスト (単体テストであっても機能テストであっても) を実行できます:🎜rrreee🎜上記の最後のコマンドcode> ディレクトリ内の <code>unit All テストを実行し、<code>report
ディレクトリにコード カバレッジ レポートを生成します。コード カバレッジ レポートを生成するには、PHP をインストールして有効にする必要があることに注意してください。 xdebug extension.🎜bootstrap.php
ファイルの内容を見てみましょう。これはエントリ スクリプトによく似ていますが、まさにそのとおりです。一連のテストを実行するためのエントリ ポイントです。🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜 上に示したように、最初に yiit をインクルードします。 php
ファイルを Yii フレームワークから取得し、いくつかのグローバル定数と必要なテスト基本クラスを初期化します。次に、test.php
設定ファイルを使用してアプリケーション インスタンスを作成します。 test.php
ファイルは、構成ファイルである main.php
を継承していますが、追加の fixture
という名前のアプリケーション コンポーネントを追加していることがわかります。 CDbFixtureManager。フィクスチャについては次のセクションで詳しく紹介します。🎜🎜 🎜🎜🎜🎜rrreee🎜🎜🎜 データベース操作を伴うテストを実行する場合、テストの実行が通常の開発を妨げないように、テスト用の専用データベースを提供する必要があります。この方法では、上記の db
構成のコメントを削除し、接続するために connectionString
属性の DSN (データ ソース名) を入力する必要があります。このような起動スクリプトを使用すると、単体テストを実行するときに、サービス要件と同様のアプリケーション インスタンスを取得できます。主な違いは、テストにフィクスチャ マネージャーと独自のテスト データベースがあることです。 🎜テスト シリーズ チュートリアル: 🎜🎜Yii Framework 公式ガイド シリーズ 38 ——特定の状態 (フィクスチャ) の定義 🎜🎜Yii Framework 公式ガイド シリーズ 39 - 単体テスト 🎜🎜Yii Framework 公式ガイド シリーズ 40 - テスト: 機能テスト 🎜上記は、Yii Framework 公式ガイド シリーズ サプリメント 37 - テスト: 概要の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。