質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

1350閲覧

PHPunitで単体テストをしたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2021/05/04 15:27

PHPunitを最近勉強始めた者です。

composerで環境を整え、いざモデルの単体テストをするって時に、どのようなコードを書いたらいいのかわかりません。

ちなみに、以下のようなコードを書いてみて成功しました。
User.php

<?php namespace User; class User { public function getFullName($first_name, $last_name) { return $first_name . ' ' . $last_name; } }

UserTest.php

<?php use PHPUnit\Framework\TestCase; use User\User; class UserTest extends TestCase { public function testGetFullName() { $user = new User(); $this->assertSame('Michael Jackson', $user->getFullName('Michael', 'Jackson')); } }

ただ、こちらは本当に簡易的なサンプルで実践的ではありません。しかもどのサイト見ても、似たような簡易的なサンプルしかないので自分が実現したいコードをどのように書けばいいのか困っています。

public static function createCompany($companyDate) { $result = false; $sql = 'INSERT INTO companies (company_name, company_url, tel, postal_code, company_adress, email, password, role) VALUES (:company_name, :company_url, :tel, :postal_code, :company_adress, :email, :password, :role)'; $company_name = $companyDate['company_name']; $company_url = $companyDate['company_url']; $company_tel = $companyDate['company_tel']; $company_postal = $companyDate['company_postal']; $company_adress = $companyDate['company_adress']; $company_email = $companyDate['company_email']; $company_pass = password_hash($companyDate['company_pass'], PASSWORD_DEFAULT); $role = $companyDate['role']; try { $pdo = connect(); $pdo->beginTransaction(); $stmt = $pdo->prepare($sql); $stmt->bindValue(':company_name', $company_name, PDO::PARAM_STR); $stmt->bindValue(':company_url', $company_url, PDO::PARAM_STR); $stmt->bindValue(':tel', $company_tel, PDO::PARAM_INT); $stmt->bindValue(':postal_code', $company_postal, PDO::PARAM_INT); $stmt->bindValue(':company_adress', $company_adress, PDO::PARAM_STR); $stmt->bindValue(':email', $company_email, PDO::PARAM_STR); $stmt->bindValue(':password', $company_pass, PDO::PARAM_STR); $stmt->bindValue(':role', $role, PDO::PARAM_INT); $result = $stmt->execute(); $pdo->commit(); return $result; } catch(\Exception $e) { $pdo->rollBack(); return $result; } }

上記のようなテストをしたいのですが、テストコードにはどのように書いたらいいのでしょうか?

参考サイトやサンプルコードなどご教示いただければ幸いです。

ちなみに素のPHPで開発しています。
PHPのバージョンは7.4.12です。

PHPunitを導入するまでに参考にしたサイト→PHPUnitでテストコードを書いて実行するまで

PHPのPHPUnitを使ってテストコードを書く方法【初心者向け】

直路丸投げの質問になってしまい申し訳ございませんが、ご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JUnitでも何でもそうですが、テストケースをきちんと作ってください。
「何を投入したときに、どういう結果を想定したものか」

INPUT(投入する情報)/OUTPUT(その結果)です。

OUTPUTがassertで判断する結果。

例えば「1と言う検索条件を与えたらID=1のデータを取得してくる」とか
「HOGEという情報を与えたらデータの登録が成功する/成功しない」とか

実用的かどうかはテストを作る人が決めることです。

登録処理なら「成功」「失敗」がおおよそのOUTPUTですが、
異常系をテストしたいなら「Exceptionの種類」や「出るエラー」まで想定するとか、まぁそこはどういうテストケースを作るか次第ですね。
「登録されたデータが想定通りか確認したい」なら「登録後にデータ取得」まで、するかどうか。まぁそうなると単体テストの域を若干超えます。

メソッドやサービスのテストをするなら「正しいIN/OUTを返すか」のみを確認すべきですから。登録した内容ではなく「登録行為」自体の成否で十分。
でもそれはテストケース次第。

でもテストケースを作る前に「どういう設計で実装されているか」が来るはずです。
テストケースもコードを見るのではなく設計を見ます。
「コードが通るようなテスト」をしてはいけませんから。都合のいいデータやテストを投入してしまいますからね。
テストは「想定した動作をするか(失敗も含め)」を確認することですので、
何を想定しているかは設計時点で決まっているはずです。

なので「テストコードをどう書いたらいいか分からない」
ということは、それだけ設計が不明瞭であるとも言えます。

タグ「テスト駆動開発」を目指すのであれば、なおのこと、設計を大事に。
むしろテストを書いてから実装するくらいで。
(なぜなら、テストは設計に基づいて作られた「求める結果」を確認するものだから)

投稿2021/05/04 20:30

編集2021/05/04 20:32
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問