Webアプリケーションやモバイルアプリケーションには,新機能の実装が不可欠であり,往々にして重要な意味合いを持っています。しかし,新しいコードを追加すれば,バグのないアプリケーションを構築するという目標の達成が阻害されるおそれもあります。慎重に進めなければ,既に実装されている機能を壊してしまうかもしれません。信頼性に優れた高品質のアプリケーションを構築するには,ユニットテストと機能テストによってコードを検証するのが1つの方法です。

テストを行うと,新しいリリースが品质目标とパフォーマンス目标を満たしていることを确认できるため,ベストプラクティスとして推奨されています。アプリケーションの开発言语や开発フレームワークに关系なく,テスト駆动型の开発アプローチには多くの共通点があります。

今回のチュートリアルでは,顾客情报を管理する新しいSymfony的アプリケーションのプロジェクトを作成します。このアプリケーションには完全なCRUD机能は実装しませんが,いくつかのメソッドとコントローラーを作成してユニットテストと机能テストを実施し,それぞれの关数から想定どおりの応答が返されることを确认します。最后に,CircleCIを活用してテストを自动化します。

前提条件

この记事は,以下の准备を済ませたうえでお読みいただくと,よりいっそう理解が深まります。

作业を开始する

まず作曲家で新しいSymfonyアプリケーションを作成します。以下のコマンドを実行します。

作曲家创建项目的symfony /网站骨架新的symfony应用程序内

上記のコマンドにより,コマンドを実行したルートフォルダーに新的symfony应用程序内という名前のフォルダーが作成され,必要な依存关系がすべてインストールされます。

次に,新たに作成されたプロジェクトに移動して,アプリケーションを実行するWebサーバーをインストールします。

//移到项目cd new symfony-app // installl web server composer需要symfony/web-server-bundle -dev ^4.4.2

これで新しいプロジェクトがセットアップされました。次は混帐によってプロジェクトをローカルで初期化し,GitHub的と连携させる必要があります。ただその前に,GitHub上に移动してプロジェクトのリポジトリを作成しておきます。

GitHub上创建新的存储库

GitHub上のプロジェクトには同じ名前を使ってかまいません。では,ローカルのプロジェクトフォルダーで混帐を初期化します。

git的初始化

これでプロジェクトがGIT中リポジトリとしてセットアップされます。次に,変更をローカルでコミットします。

git添加。git提交-m“初始提交”

git的远程添加コマンドを使用して,プロジェクトフォルダーのターミナルでリモートリポジトリを登录します。このコマンドには以下の2つの引数を设定します。

  • リモート名 - 例:起源
  • リモートURL - 例:https://github.com//.git

今回は以下のようにします。

//添加远程起源git的远程添加原产https://github.com/yemiwebby/new-symfony-app.git

次に,GitHubアカウントで作成した大师ブランチにローカルプロジェクトをプッシュします。以下のコマンドを実行します。

//推回购混帐推-u主产地

これで新しいSymfonyプロジェクトがセットアップされ,リモートリポジトリにプッシュされました。次のセクションでは,客户のコントローラーを作成し,エンティティクラスを作成します。

コントローラーを作成する

コントローラーの役割は,HTTPリクエストを处理して适切な応答を返すことです。このアプリケーション用のコントローラーを自动的に生成するには,Symfony的と共にインストールされるMakerBundleを使用します。以下のコマンドを実行します。

PHP斌/控制台化妆:控制器CustomerController

これにより,以下2つのファイルが新たに作成されます。

  • 一个コントローラー——場所:SRC /控制器/ CustomerController.php
  • ビューページ - 场所:模板/客户/ index.html.twig

CustomerController.phpファイルを開き,内容を以下で置き換えます。

< ? php命名空间应用程序\控制器;使用Symfony的\包\ FrameworkBundle \控制器\一个AbstractController;使用Symfony的\分量\路由\注释\路径;CustomerController扩展一个AbstractController{/ ** * @Route( “/”,名字= “客户”,方法= { “GET”})* /上市功能指数(){$ CUSTOMERNAME=“李四”;返回$这- >给予'客户/ index.html.twig'['名称'=>$ CUSTOMERNAME]);}}

アプリケーションのルートを定义する场合,Symfony的が最も推奨するオプションはルートアノテーションです。ここでは,客户という名前のルート/を定义しています。これは,ホームページに対するすべてのリクエストを,ここで定义するメソッドに転送するというSymfony的への命令になります。つまり,ユーザーのリクエストがこのルートをヒットすると,上记のファイル内にハードコードされた$ CUSTOMERNAMEを含むビューが,指数()によってレンダリングされます。

次に,模板/客户/ index.html.twigのビューファイルを开き,内容を以下で置き换えます。

{% '延伸base.html.twig' %} {%块标题%}客户页{%末端嵌段%} {%块主体%}  

您好,欢迎到客户页

客户名称是:{{名称}} {%端嵌段%}

この更新により,既定の顾客名を示す的名字変数をビューが動的にレンダリングするようになります。以下のコマンドを使用することで,このアプリケーションをローカルで実行できます。

PHP斌/控制台服务器:运行

次にHTTP://本地主机:8000に移動してホームページを表示します。

应用主页

このページは,コントローラー内でハードコードされた顾客名をレンダリングし,ビューに渡しています.MVC构造のアプリケーションのビュー内でコンテンツを动的にレンダリングするのと似たプロセスです。次に,この动作を検证する机能テストを记述していきます。

エンティティを作成する

ここでは客户オブジェクトを表すモデルを作成します。そのために,以下のコマンドを実行します。

php bin/控制台制作:实体客户

SRC /实体/ Customer.phpファイルへのフィールドの追加を求めるメッセージが表示されます。フィールドは手動で追加することもできますが,”名字」と「」を客户クラスのフィールドとして入力すると,Symfony的MakerBundleが残りの处理を実行してくれます。以下の図を参照してください。

使用makerbundle创建实体

Customer.phpファイルは以下のようになります。確認し,こちらの内容に手元のファイルを合わせて更新してください。

< ? php命名空间App \实体;使用App \ Repository \ CustomerRepository;使用学说\ ORM \制图作为ORM;/ ** * @ORM \实体(repositoryClass = CustomerRepository ::类)* /客户{/ ** * @ORM \ ID()* @ORM \ GeneratedValue()* @ORM \柱(类型= “整数”)* /私人的$ id;/ ** * @ORM \柱(类型= “字符串”,长度= 255)* /私人的firstName美元;/ ** * @ORM \柱(类型= “字符串”,长度= 255)* /私人的$ lastName的;上市功能的getId()INT{返回$这- >id;}上市功能的getFirstName()字符串{返回$这- >名字;}上市功能setFirstName字符串firstName美元{$这- >名字=firstName美元;返回$这;}上市功能getLastName()字符串{返回$这- >;}上市功能setLastName字符串$ lastName的{$这- >=$ lastName的;返回$这;}上市功能getCustomerFullName()字符串{返回$这- >的getFirstName()$这- >getLastName();}}

作成されたgetter二传手は,Symfony的の自动生成によるものです。また,顾客のフルネームを返す新しいメソッドgetCustomerFullName ()を追加しています。チュートリアルの后半では,ここで定义された个々の关数に対応するユニットテストを记述します。

PHPUnit的を使ってテストを作成する

Symfony的は,PHPのテストフレームワークPHPUnit的と连携しています。どのようなテストを记述する场合も,以下のコマンドによって必ず事前にPHPUnit的を実行してください。

/ bin / phpunit)

今回のようにこのコマンドを初めて実行する场合は,PHPUnit的とアプリケーションに必要な依存关系がすべてインストールされます。

ユニットテストを记述する

一般的にユニットテストは,コードの个别コンポーネント(ユニット)のテストと定义されます.Symfonyアプリケーション用のユニットテストは,标准的なPHPUnit的ユニットテストの场合と同様に记述されます。ここでは,客户实体ファイル内に作成されたメソッドのテストを记述していきます。

まず,测试フォルダー内に实体という新しいフォルダーを作成します。新しく作成したフォルダー内に新しいファイルを作成し,CustomerTest.phpという名前を付けます。このファイルを開き,以下のような内容にします。

< ? php命名空间应用程序\测试\实体;使用应用程序\实体\客户;使用PHPUnit的\框架\测试用例;CustomerTest扩展测试用例{上市功能testSettingCustomerFirstName(){$客户=客户();firstName美元=“约翰”;$客户- >setFirstNamefirstName美元);$这- >assertequalfirstName美元$客户- >的getFirstName());}上市功能testSettingCustomerLastName(){$客户=客户();$ lastName的=“母鹿”;$客户- >setLastName$ lastName的);$这- >assertequal$ lastName的$客户- >getLastName());}上市功能testReturnsCustomerFullName(){$客户=客户();$客户- >setFirstName“约翰”);$客户- >setLastName“迪奥”);fullName美元=$客户- >的getFirstName()$客户- >getLastName();$这- >assertSamefullName美元$客户- >getCustomerFullName());}}

上記のファイルでは,次の3種類のテストを記述しました。

  • testSettingCustomerFirstName():ここでは客户クラスのインスタンスを作成し,顧客のファーストネームを表すダミー値を設定しました。次にPHPUnit)のアサーションメソッドを使用して名前を確認しています。
  • testSettingCustomerLastName():1つ目に定义したメソッドと同様に,顾客のラストネーム用に作成された吸气メソッドと设定器メソッドの両方をテストしました。
  • testReturnsCustomerFullName():このテストでは最後に,顧客の名字が正常に取得できることを确认します。

テストをローカルで実行する

先ほどはターミナルで/ bin / phpunit)コマンドを使用してテストを実行しました。これでも問題はありませんが,少し構成に手を加えたいと思います。composer.jsonファイルの脚本セクションに追加することで,このコマンドを自動化します。composer.jsonを開き,テストコマンドを脚本セクションに追加します。

{... “脚本”:{..., “测试”:[ “./bin/phpunit”]}}

これ以降はこのテストコマンドを作曲家测试として利用できます。

运行测试单元

プロジェクトをCircleCIに追加する前に,非常にシンプルな机能テストを记述してみましょう。

機能テストを記述する

机能テストでは,网络サイトの阅覧,リンクのクリック,フォームへの入力,ページに表示された要素の确认などを,ブラウザに命令することができます。これを行うには,测试フォルダーに控制器というフォルダーを作成します。CustomerControllerのテストスクリプトは,このフォルダーに格纳されます。新しく作成したフォルダー内にCustomerControllerTest.phpというファイルを作成します。このファイルを开き,以下のような内容にします。

< ? php命名空间应用程序\测试\控制器;使用Symfony的\包\ FrameworkBundle \测试\ WebTestCase;CustomerControllerTest扩展WebTestCase{上市功能testShowCustomer(){$客户端=静态::createClient();$客户端- >请求'得到''/');$这- >assertResponseStatusCodeSame200$客户端- >GETRESPONSE()- >getStatusCode());$这- >assertStringContainsString“客户名称是:李四”$客户端- >GETRESPONSE()- >的getContent());}}

上记のコードスニペットでは,ステータスコード200を返し,HTTP応答が成功したことを确认しています。次に,先ほどチュートリアルで表示されていた内容が,想定どおりページに含まれていることを确认しています。

このテストは,以下のコマンドで再実行できます。

作曲家测试

运行测试功能

CircleCIでテストを自動化する

すべてのテストがローカルで成功することがわかったら,コードの更新がGitHubリポジトリにプッシュされたときにテストが自動実行されるようにする必要があります。

CircleCIが使用する构成ファイルを作成するには,プロジェクトのルートに移动して.circleciという名前のフォルダーを作成し,その中にconfig.ymlという名前のファイルを作成して,以下のような内容にします。

版本:2组的工作:构建:泊坞窗:#指定你在这里想要的版本 - 图片:circleci / PHP:7.4节点的浏览器的步骤: - 结帐 - 运行:sudo易于更新#PHP CircleCI 2.0配置文件#PHP CircleCI 2.0配置文件sudo易于安装的zlib1g-dev的libsqlite3-dev的 - 运行:sudo的搬运工-PHP-EXT安装拉链#下载并缓存依赖 -  restore_cache:键:# “composer.lock” 可如果它致力于回购可以使用 -  V1-依赖 -  {{校验“composer.json”}}#退回到采用最新的高速缓存,如果没有找到精确匹配 -  V1-dependencies-  - 运行:名称:“安装依赖”命令:作曲家安装-n --prefer  - 距离-  save_cache:关键:V1-依赖 -  {{校验 “composer.json”}}路径: -  ./vendor#运行测试使用PHPUnit  - 运行:名称: “运行测试” 命令:作曲家测试

ここではまず,多克尔イメージと共にインストールするPHPのバージョンを指定しています。この泊坞イメージはCircleCIイメージレジストリからプルされます。次に,すべての依存关系をプロジェクトにインストールするよう指定し,最后にテストの実行コマンドを含めています。

この段階で,これまでの変更をすべてコミットし,すべての更新をGitHubのプロジェクトリポジトリにプッシュすることができます。

CircleCIにプロジェクトをセットアップする

ここではSymfony的アプリケーションをCircleCIに接続します。CircleCIの网络サイトに移动して,お使いのアカウントでログインします.CircleCIコンソールで[加入项目(プロジェクトの追加)]ページに移动して[建立项目(プロジェクトのセットアップ)]をクリックします。

CircleCI项目仪表盘

これにより,以下のようなページが表示されます。

CircleCI项目配置页

[动工(ビルドの開始)]ボタンをクリックすると,提供されているCircleCI構成を新しいブランチのプロジェクトに追加するか,手動で構成をセットアップするかを確認するメッセージが表示されます。[手动添加(手動で追加)]を選択します。

开始构建提示

構成ファイルはGitHubにプッシュする前に追加しているため,(动工(ビルドの开始)]をクリックします。これにより,构成ファイルに基づいて継続的インテグレーション(CI)パイプラインが実行され,パイプラインのステータスが表示されます。

以下は実行中の状態です。

构建运行

以下は実行が成功した後の状態です。

构建成功

构建结果

これですべての手顺が完了しました。作成したすべてのテストは正常に実行されています。

まとめ

Symfony的は,洗练された构造と再利用可能なコンポーネントで知られ,最も长い歴史を夸る,最も安定したPHPフレームワークとして高く评価されています。このチュートリアルでは,新しいSymfony的アプリケーションを作成し,定义したメソッドおよびコントローラー用のユニットテストと机能テストをPHPUnit的で记述する方法を说明しました。さらにCircleCIを使って自动化されたCIパイプラインをセットアップする方法を解说しました。

残念ながら,テストのエキスパートになるためには,この記事の知識だけでは到底足りません。ここで紹介したのはごく一部の情報であり,さらに多くの知識は各自の努力によって習得する必要があります。しかし,一般的なSymfonyアプリケーションにおけるテスト構造の基礎知識や,テストを自動化する基本的な方法については理解していただけたのではないかと思います。今回のソースコードはGitHub上で公开されているので,中身をじっくりご覧になると共に,CircleCIの公式ドキュメントを参照して,さらに学习を进めていただければ幸いです。


Olususi奥卢耶米氏は,テクニカルの世界に大きな情热を倾け,プログラミングに没头し,网页开発なしには生きていけないほど,最新テクノロジーを取り入れることが大好きです。