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

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

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

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

PHPUnit

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

Q&A

2回答

8431閲覧

PHPUnitで配列の順番を気にしないテスト

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

PHPUnit

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

0グッド

0クリップ

投稿2016/04/14 03:57

編集2016/04/14 05:35

PHPUnitを使ってテストしていますが、配列の順番を気にしないテストを書くことはできますでしょうか?

php

1$actual = [2,3,1]; 2$expected = [1,2,3]; 3 4// assertかけるとtrueになってほしい

sortかければいい話なんですが、実際にテストしたいのは連想配列になっているので
テストにsortを書くとテストがごちゃごちゃしてしまうので避けたいです。

actualを返す処理にソートを入れることもできますが、簡単にテストできる方法があるのであれば
教えて下さい。

==========================================================
加筆しました。
コメントありがとうございます。

例えば、このような場合においても解決する方法はございますでしょうか?
==比較ではこのケースだと解決できないようです。

php

1$actual = [['a' => 'hoge'], ['b' => 'fuga']]; 2$expected = [['b' => 'fuga'], ['a' => 'hoge']]; 3 4// assertかけるとtrueになってほしい

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

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

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

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

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

guest

回答2

0

array_diffを使う方法が…と紹介しようと思いましたが

sortかければいい話なんですが、実際にテストしたいのは連想配列になっているので

この場合は == で比較すればいいかと.

php

1<?php 2 3$actual = ['name' => 'John', 'age' => '20']; 4$expected = ['age' => '20', 'name' => 'John']; 5var_dump($actual == $expected); // bool(true) 6 7$actual = ['name' => 'John', 'age' => '20']; 8$expected = ['age' => '2e1', 'name' => 'John']; 9var_dump($actual == $expected); // bool(true)

これだと'20''2e1'が等価になってしまうので,それを防ぎたいならksortして===ですね.PHPにあるソート関数はsortだけではありません.

php

1<?php 2 3$actual = ['name' => 'John', 'age' => '20']; 4$expected = ['age' => '20', 'name' => 'John']; 5ksort($actual); ksort($expected); 6var_dump($actual === $expected); // bool(true) 7 8$actual = ['name' => 'John', 'age' => '20']; 9$expected = ['age' => '2e1', 'name' => 'John']; 10ksort($actual); ksort($expected); 11var_dump($actual === $expected); // bool(false)

【蛇足】

逆に連想配列ではなく,数値添字配列で順番を問わず中身だけの比較をしたい場合,assertEqualsのソートオプションが使えそうです.普通に自分でソート書いたほうがスッキリしそうな気はしますが…

投稿2016/04/14 04:30

編集2016/04/14 04:48
mpyw

総合スコア5223

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

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

0

連想配列なら普通に equalTo とか assertEquals で大丈夫だと思います。

php

1$actual = ['name' => 'John', 'age' => '20']; 2$expected = ['age' => '20', 'name' => 'John']; 3$this->assertThat($actual, $this->equalTo($expected)); 4$this->assertEquals($expected, $actual);

ただの配列なら equalTo とか assertEquals にそういうオプションがあります(true の部分)。

php

1$actual = [2,3,1]; 2$expected = [1,2,3]; 3$this->assertThat($actual, $this->equalTo($expected, 0, 0, true)); 4$this->assertEquals($expected, $actual, '', 0, 0, true);

(どちらも "20" == "2e1" みたいな問題は避けられない)

投稿2016/04/14 04:54

ngyuki

総合スコア4514

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

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

mpyw

2016/04/14 05:01 編集

assertEqualsって==相当の比較だったんですね! (他の方へ: すぐ誤解に気づいてコメント修正したので話が噛み合ってないです)
ngyuki

2016/04/14 04:59

いえ、`$actual == $expected` と等価だからだったと思います
mpyw

2016/04/14 05:07

んん…パッと見でロジックが分かりにくい…
ngyuki

2016/04/14 05:11

実質は == と同じではないかと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問