今とあるバッチのテストをしようと考えています。
バッチの処理としては、DBから必要なデータを取ってきて(クラスを使っています)、そのデータを元にPEAR::HTTP_Requestクラス使ってGETリクエストを送信するようなものです。
そもそもテストというものに関してド素人なのでよくわかっていないのですが、こういったプログラムをPHPUnitを使ってテストすることは可能なのでしょうか。
出来ればDBからデータ取ってくる部分と、HTTP_Requestクラス使ってGETリクエストを投げる部分をモック化(?)して、これらの戻り値をこっちで制御していくつかのケースでテストしたいです。
テストの先頭で、requireで読み込んだらファイルが実行されてしまうし、execなどを使ってもプログラム内のクラスをモック化する方法が分かりません。
長くなりましたが、聞きたい事としては、こういった逐一実行するようなプログラムのテストはPHPUnitを使ってテスト出来るものなのでしょうか。
また、PHPUnitを使ってテストする場合、テスト対象ファイルの内部で読み込まれたクラスをモック化するにはどうしたらよりのでしょうか。
No.1ベストアンサー
- 回答日時:
DBからデータを拾ってループでリクエストを拾えばさほど難しい話ではないような
気がしますが、httpでの処理をトレースする場合、どこかで引っかかると
その後の処理が流れずにタイムアウトする可能性が高いですね
DBの接続部分と、リクエスト部分のプログラムをわけて
リクエストは非同期で回した方がよいかもしれません
この回答への補足
ご回答ありがとうございます。
具体的には下記のようなバッチ(超単純化して雑ですが)をテストしたいと考えてます。
この既存のプログラムは書き換える事ができず、これが正しく動作していることを確認したいのです。
DBを扱うクラスとかRequestクラスに依存したくないので、これらをモック化したいと考えています。
batch.phpの中でgetIdメソッドとかをモック化してテストするにはどうしたらよいのでしょうか。
【batch.php】
<?php
require_once "HTTP/Request.php";
require "hogeDbClass.php";
$hogeDb = new hogeDbClass();
$id = $hogeDb->getId();
if ($id === false) echo "データ取得失敗";
$web = new HTTP_Request();
if ($id == false) {
$web->setURL('http://test.failure.info');
$result = $web->sendRequest();
if ($web->getResponseCode() !== 200) {
echo "通信失敗";
} else {
echo "通信成功";
}
} else {
$web->setURL('http://test.success.info');
$result = $web->sendRequest();
if ($web->getResponseCode() !== 200) {
echo "通信失敗";
} else {
echo "通信成功";
}
}
?>
【hogeDbClass.php】
<?php
class hogeDbClass
{
private $_db;
public function __construct()
{
$this->_db = new PDO();
}
public function getId()
{
$sql = 'select id from test';
$stmt = $this->_db->prepare($sql);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
?>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- 学校 看護学生です。学校での勉強の仕方について相談させていただきます。1月上旬に卒業テスト、2月中旬に国試 3 2023/01/17 10:48
- 学校 ていただきます。1月上旬に卒業テスト、2月中旬に国試を控えています。 卒業テストでは、クラスの1/3 1 2023/01/17 10:32
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- 予備校・塾・家庭教師 浪人生です。 予備校の授業で、予習復習の時間をしっかりとって理解もできてるのですがどうしても時間が余 1 2022/04/28 22:26
- 中学校 終わった…。 中2です。いろいろと終わりました…。 1つ目が塾…。私の塾では学校のテスト前(中間テス 10 2022/05/24 17:55
- ノートパソコン Windowsが起動しなくなってしまいました。 4 2023/08/28 16:30
- 子供・未成年 自分は無理しすぎだと思いますか? 5 2022/05/01 11:42
- その他(AV機器・カメラ) ZOOMが使用できるかどうか? 2 2022/08/08 20:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのクラスメソッドの定義が長...
-
class定義のphpをファイル分割...
-
配列とオブジェクトの違い
-
こちらはただの直列処理ですか?
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
VBでメールを送る時のSMT...
-
ワードプレスサイト PHP8.0.25...
-
FTPコマンドでディレクトリごと...
-
アップロード画像数でCSSを分け...
-
二重投稿防止方法
-
PHPのif文でその処理を途中で抜...
-
入力フォームの空白や改行を制...
-
php5のrename()は日本語をリネ...
-
sqlで日付が一番古いデータの月...
-
HYのAM11:00のラップの部分の歌...
-
i18n_convert と mb_convert_e...
-
php 完了画面の送信メールのコ...
-
htmlのエラーについて(デバッグ)
-
PHPExcel処理速度が遅い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスメソッドの定義が長...
-
ラッパークラスって何ですか?
-
'_'(アンダースコア)の使い方...
-
class定義のphpをファイル分割...
-
配列とオブジェクトの違い
-
PHP4、PHP5 1ファイル複数クラ...
-
関数定義の関数名の前にある&(...
-
php、可変プロパティ名について
-
クラス設計の良い参考書を教え...
-
phpのクラスにて別ファイルの変...
-
class.upload.phpの戻り値(返...
-
【PHP】クラス と 関数 の違い
-
php インスタンスとオブジェク...
-
Re: Cookieを使ってオブジェク...
-
PHPでサブクラスからスーパクラ...
-
クラス
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
index.phpに入るには、どうすれ...
おすすめ情報