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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

ユニットテスト

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

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

テスト駆動開発

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

Q&A

0回答

1207閲覧

テストコードを書いてみたのですが、理解があっているのかを確認したいです。

tenlife

総合スコア70

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

ユニットテスト

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

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

テスト駆動開発

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

0グッド

0クリップ

投稿2020/10/19 08:42

laravel勉強中のものです。

調べながら初めてテストを書いたのですが、流れとしてこれで良いのか不安なので質問させて頂きます。

私が記載しているコメントアウトは処理の説明(自分の理解)を書いているのですが、あっていますでしょうか?

LoginTest

1<?php 2 3namespace Tests\Feature; 4 5use Illuminate\Foundation\Testing\RefreshDatabase; 6use Illuminate\Foundation\Testing\WithFaker; 7use Tests\TestCase; 8use App\User; 9 10class LoginTest extends TestCase 11{ 12 use RefreshDatabase; 13 14 protected $user; 15 16 public function setUp(): void 17 { 18 parent::setUp(); 19 20 // テストユーザ作成 21 $this->user = factory(User::class)->create(); 22 } 23 /** 24 * A basic feature test example. 25 * 26 * @return void 27 */ 28 public function test_正しいパスワードの場合() 29 { 30 $response = $this->get('/login'); 31 $response->assertStatus(200); 32 33 // ログインする 34 $response = $this->post('/login', ['email' => $this->user->email, 'password' => 'Test1234']); 35 // リダイレクトでページ遷移してくるのでstatusは302 36 $response->assertStatus(302); 37 // リダイレクトで帰ってきた時のパス 38 $response->assertRedirect('/'); 39 // このユーザーがログイン認証されているか 40 $this->assertAuthenticatedAs($this->user); 41 42 } 43 44 public function test_間違ったパスワードの場合() 45 { 46 $response = $this->get('/login'); 47 $response->assertStatus(200); 48 49 // パスワードが正しく無い状態でログイン 50 $response = $this->post('/login', ['email' => $this->user->email, 'password' => 'Test123']); 51 // リダイレクトで戻ってくる。 52 $response->assertStatus(302); 53 // 戻ってきた時はログインページにいる事 54 $response->assertRedirect('/login'); 55 // 失敗しているので認証されていない事 56 $this->assertGuest(); 57 58 } 59 60 public function test_ログアウトが正しくできるか() 61 { 62 // ログイン状態の作成 63 $response = $this->actingAs($this->user); 64 $response = $this->get('/'); 65 $response->assertStatus(200); 66 // ログアウト処理をする 67 $this->post('logout'); 68 // ログアウト出来たら200番が帰ってきているか 69 $response->assertStatus(200); 70     // ログインページにいる事。ここは確認の仕方はこれで大丈夫でしょうか。 71     $response = $this->get('/login'); 72     $response->assertStatus(200); 73 // 認証されていないことを確認 74 $this->assertGuest(); 75 } 76} 77

factories

1<?php 2 3/** @var \Illuminate\Database\Eloquent\Factory $factory */ 4 5use App\User; 6use Faker\Generator as Faker; 7use Illuminate\Support\Str; 8 9/* 10|-------------------------------------------------------------------------- 11| Model Factories 12|-------------------------------------------------------------------------- 13| 14| This directory should contain each of the model factory definitions for 15| your application. Factories provide a convenient way to generate new 16| model instances for testing / seeding your application's database. 17| 18*/ 19 20$factory->define(User::class, function (Faker $faker) { 21 return [ 22 'name' => $faker->name, 23 'email' => $faker->unique()->safeEmail, 24 'email_verified_at' => now(), 25 'password' => bcrypt('Test1234'), 26 'remember_token' => Str::random(10), 27 ]; 28});

以下確認したい点です。

・リダイレクト処理は302、ajaxなどapiリクエストはJsonを付けて書き、statusは200が返ってくる。
・現在そのページにいる事を確認したい場合はget(url)とassertStatus(200)で確認する。(他の確認方法はありますか?)

参考にしたサイト
参考1
参考2

laravel7.x

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

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

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

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

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

m.ts10806

2020/10/19 08:49

どこまでの確度を意識して作るかにもよります。 ある程度のアプリケーションでということでしたら、「単体テスト」として項目を洗い出してテスト仕様書を作るところからになりますし、そのインプットとしては詳細設計書があります。
tenlife

2020/10/19 08:59

コメントありがとうございます。 確かにそもそものどこまでの?と言う部分がぬけていました。 オリジナルアプリを作っているので、まずは今回のような単体テスト、httpアクセスのテストなどの基本的な部分をメインで進める。この認識で大丈夫でしょうか。
m.ts10806

2020/10/19 09:26

>httpアクセスのテストなどの基本的な部分をメインで進める。この認識で大丈夫でしょうか。 結局は「決める」ことなので、自身で箇条書きレベルで良いので想定するテストケースを洗い出して「ここをテストする」と決めてその通りにテストを書いていくだけかと思います。 基本はINPUT-OUTPUTが合っているかを確認します。 「どういう値を与えたらどういう結果になるか」ですね。
tenlife

2020/10/19 09:44

返信ありがとうございます。 承知しました。 まずはどこまでのテストを実装したいのか?を明確にしていく所から始めていきます。
m.ts10806

2020/10/19 10:36

タグにあるような「テスト駆動開発」であれば、そもそも設計段階からテスト項目が決まっているものと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問