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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

PHPUnit

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

Q&A

解決済

1回答

350閲覧

PHPUnitで自動テストが通らない理由が知りたい。

dera

総合スコア28

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

PHPUnit

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

0グッド

0クリップ

投稿2023/11/09 00:30

実現したいこと

画面上で値を入力し、テストした際は更新できたとき、できなかったとき、見つからなかったときの
3パターンテストして期待通りの結果が得られたが、
PHPUnitによる自動テストではOKがでない。PHPUnitでの自動テストに合格したい。

前提

データベース更新処理で
更新できたとき、失敗したとき、更新対象が見つからない時の3点をテストする

・DB接続済み
・テーブル作成済み
・データ用意済み

・idを条件にtitle,bodyの内容を更新する
・初期表示は""(空文字)
・idが見つからない時は「更新対象が見つかりません」
・失敗したときは「更新が失敗しました」
・成功したときは「更新が完了しました」
メッセージを表示する

発生している問題・エラーメッセージ

PHPUnit 9.5.28 by Sebastian Bergmann and contributors. .FFF 4 / 4 (100%) Time: 00:00.488, Memory: 6.00 MB There were 3 failures: 1) Training027Test::test with data set "更新対象なし" (array(-1, 'テストタイトル 2023-11-09 00:09:06', 'テスト内容 2023-11-09 00:09:06', 1), '更新対象が見つかりません') 「更新対象が見つかりません」 と表示してください。 Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'更新対象が見つかりません' +'' /var/www/html/tests/Training027Test.php:38 2) Training027Test::test with data set "更新成功" (array(1, 'テストタイトル 2023-11-09 00:09:06', 'テスト内容 2023-11-09 00:09:06', 1), '更新が完了しました') 「更新が完了しました」 と表示してください。 Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'更新が完了しました' +'' /var/www/html/tests/Training027Test.php:38 3) Training027Test::test with data set "更新失敗" (array(1, 'あああああああああああああああああああああああああああああ...ああああああ', 'テスト内容 2023-11-09 00:09:06', 2), '更新が失敗しました') 「更新が失敗しました」 と表示してください。 Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'更新が失敗しました' +''

###該当のソースコード

php

1<?php 2 3require_once __DIR__ . '/xxxx.php'; 4 5class xxxx extends xxxx 6{ 7 8 /** 9 * @dataProvider provider 10 * 11 * @return void 12 */ 13 public function test($param, $ans) 14 { 15 try { 16 $url = $this->getUrl(); 17 18 if (!is_null($param)) { 19 $url = "{$url}"; 20 $result = $this->postContent($url, $param); 21 } else { 22 $result = file_get_contents($url); 23 } 24 25 $html = $this->parseHtml($result); 26 $result = $html['body']['div'] ?? null; 27 } catch (Exception $e) { 28 $result = ''; 29 } 30 31 if (is_null($param)) { 32 // 初期表示 33 if (is_array($result)) { 34 $result = ""; 35 } 36 } 37 38 $this->assertEquals($ans, trim($result), "「{$ans}」 と表示してください。"); 39 } 40 41 public function provider() 42 { 43 return [ 44 '初期表示' => [ 45 'param' => null, 46 'ans' => "", 47 ], 48 '更新対象なし' => [ 49 'param' => [ 50 'id' => -1, 51 'title' => 'テストタイトル ' . date('Y-m-d H:i:s'), 52 'body' => 'テスト内容 ' . date('Y-m-d H:i:s'), 53 'open_flg' => 1, 54 ], 55 'ans' => "更新対象が見つかりません", 56 ], 57 '更新成功' => [ 58 'param' => [ 59 'id' => 1, 60 'title' => 'テストタイトル ' . date('Y-m-d H:i:s'), 61 'body' => 'テスト内容 ' . date('Y-m-d H:i:s'), 62 'open_flg' => 1, 63 ], 64 'ans' => "更新が完了しました", 65 ], 66 '更新失敗' => [ 67 'param' => [ 68 'id' => 1, 69 'title' => str_repeat('あ', 1000), 70 'body' => 'テスト内容 ' . date('Y-m-d H:i:s'), 71 'open_flg' => 2, 72 ], 73 'ans' => "更新が失敗しました", 74 ], 75 ]; 76 } 77} 78

該当のソースコード

php

1<?php 2 3 4// フォームが送信されたかどうかを確認 5if ($_SERVER["REQUEST_METHOD"] == "POST") { 6 // タイトル、内容、が送信されたかどうかを確認 7 if (isset($_POST["title"]) && isset($_POST["body"]) && isset($_POST["id"])) { 8 // フォームから送信されたデータを取得 9 $id = $_POST['id']; 10 $title = $_POST['title']; 11 $body = $_POST['body']; 12 13 // DB接続 14 $db_host = xxxx; 15 $dsn = xxxxx; 16 $user = xxxxx; 17 $password = xxxxx; 18 19 try { 20 $dbh = null; 21 $dbh = new PDO($dsn, $user, $password); 22 } catch (PDOException $e) { 23 } 24 25 // 更新対象のidが存在するか確認 26 $sql = "select title, body from testtable where id = ?"; 27 $stmt = $dbh->prepare($sql); 28 $stmt->execute([$id]); 29 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 30 $count = count($rows); 31 if ($count === 0) { 32 $message = "更新対象が見つかりません"; 33 } else { 34 // SQL作成 35 $stmt = $dbh->prepare("UPDATE testtable SET title = :title, body = :body, updated_at = NOW() WHERE id = :id"); 36 37 //登録するデータをセット 38 $stmt->bindParam(':id', $id, PDO::PARAM_INT); 39 $stmt->bindParam(':title', $title, PDO::PARAM_STR); 40 $stmt->bindParam(':body', $body, PDO::PARAM_STR); 41 42 try { 43 $stmt->execute(); 44 $message = "更新が完了しました"; 45 } catch (PDOException $e) { 46 $message = "更新が失敗しました"; 47 } 48 } 49 } else { 50 $message = "更新が失敗しました"; 51 } 52} else { 53 $message = ""; 54} 55 56?> 57 58<!DOCTYPE html> 59<html> 60<form method="post"> 61 <p>ID:<input type="text" name="id" /></p> 62 <p>タイトル:<input type="text" name="title" /></p> 63 <p>内容:<textarea type="text" name="body" rows="3"></textarea></p> 64 <button>送信</button> 65</form> 66</form> 67<h1>メッセージ</h1> 68<div name="ans" style="border: 1px solid;padding:10px"> 69 <?php echo $message; 70 ?> 71</div> 72 73</html>

試したこと

画面上では更新完了、失敗、見つからなかったときの3パターンが表示される
完了時はDBが更新されているし、それ以外は更新されていないことも確認しました。

結果に""(空文字)が返ってくる

補足情報(FW/ツールのバージョンなど)

PHP8
Mysql
PHPUnit9.5

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

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

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

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

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

guest

回答1

0

自己解決

単純にロジックを間違えていました。
try {
// 更新対象のデータが存在するか確認する
$stmt = $dbh->prepare("SELECT * FROM blog WHERE id = :id AND deleted_at IS NULL");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if ($row) { // データが存在する場合は更新処理を実行する $updateStmt = $dbh->prepare("UPDATE blog SET title = :title, body = :body, updated_at = NOW() WHERE id = :id"); $updateStmt->bindParam(':id', $id, PDO::PARAM_INT); $updateStmt->bindParam(':title', $title, PDO::PARAM_STR); $updateStmt->bindParam(':body', $body, PDO::PARAM_STR); $updateStmt->execute(); $message = '更新が完了しました'; } else { $message = '更新対象が見つかりません'; } } catch (PDOException $e) { $message = '更新が失敗しました'; }

投稿2023/11/09 04:22

dera

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問