Testavimas su Laravel 5.1

Justas Maziliauskas, maziliauskas.lt

Žalias

package.json

{
  "private": true,
  "devDependencies": {
    "gulp": "^3.8.8"
  },
  "dependencies": {
    "laravel-elixir": "^3.0.0"
  }
}
npm install
var elixir = require('laravel-elixir');

elixir(function (mix) {
    mix.phpUnit();
});

gulpfile.js

vagrant@homestead:~/projects/meetup-tests$ gulp
[07:40:40] Using gulpfile ~/projects/meetup-tests/gulpfile.js
[07:40:40] Starting 'default'...
[07:40:40] Starting 'phpUnit'...

Fetching PhpUnit Source Files...
   - tests/**/*Test.php

[07:40:40] Finished 'default' after 23 ms
[07:40:40]

       *** Debug Cmd: ./vendor/bin/phpunit --colors --debug -c phpunit.xml ***

[07:40:41] PHPUnit 4.8.18 by Sebastian Bergmann and contributors.


Starting test 'ExampleTest::testBasicExample'.
.

Time: 811 ms, Memory: 13.00Mb

OK (1 test, 2 assertions)
[07:40:41] gulp-notify: [Green!] Your phpUnit tests passed!
[07:40:41] Finished 'phpUnit' after 921 ms
class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->visit('/')
             ->see('Laravel 5');
    }
}

tests/ExampleTest.php

<body>
    <div class="container">
        <div class="content">
            <div class="title">Laravel 6</div>
        </div>
    </div>
</body>

welcome.blade.php

vagrant@homestead:~/projects/meetup-tests$ gulp
[07:57:19] Using gulpfile ~/projects/meetup-tests/gulpfile.js
[07:57:19] Starting 'default'...
[07:57:19] Starting 'phpUnit'...

Starting test 'ExampleTest::testBasicExample'.
F

There was 1 failure:

1) ExampleTest::testBasicExample
Failed asserting that '<!DOCTYPE html>

<...>

    <body>
        <div class="container">
            <div class="content">
                <div class="title">Laravel 6</div>
            </div>
        </div>
    </body>
</html>
' matches PCRE pattern "/Laravel 5/i".

FAILURES!
Tests: 1, Assertions: 2, Failures: 1.

[07:57:21] gulp-notify: [Red!] Your phpUnit tests failed!
[07:57:21] Finished 'phpUnit' after 2.21 s
<div class="content">
    <div class="title">Laravel 5</div>
    <div class="title">Laravel 6</div>
</div>
[08:07:51] gulp-notify: [Green!] Your phpUnit tests passed!
class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->visit('/')
             ->see('Laravel 5');
    }
}
public function testBasicExample()
{
    $this->visit('/')
         ->see('Laravel 5')
         ->dontSee('Laravel 6');
}
[08:11:17] gulp-notify: [Red!] Your phpUnit tests failed!
<div class="title">Laravel 5</div>
<div class="title">Laravel 6</div>
public function testBasicExample()
{
    $this->visit('/')
         ->see('Laravel 5')
         ->dontSee('Laravel 6');
}
<div class="title">Laravel 5</div>
{{--<div class="title">Laravel 6</div>--}}
[08:07:51] gulp-notify: [Green!] Your phpUnit tests passed!

Create new test

pa make:test FormSubmitTest

*pa - php artisan

routes.php

get('auth/register', 'Auth\AuthController@getRegister');
post('auth/register', 'Auth\AuthController@postRegister');

get('dashboard', function () {
    return 'OK';
});

register.blade.php

<form method="POST" action="/auth/register">
    {!! csrf_field() !!}

    <div>
        Name
        <input type="text" name="name" value="{{ old('name') }}">
    </div>

    <div>
        Email
        <input type="email" name="email" value="{{ old('email') }}">
    </div>

    <div>
        Password
        <input type="password" name="password">
    </div>

    <div>
        Confirm Password
        <input type="password" name="password_confirmation">
    </div>

    <div>
        <button type="submit">Register</button>
    </div>
</form>

FormSubmitTest.php

public function testNewUserRegistration()
{
    $this->visit('auth/register')
         ->type('Justas', 'name')
         ->type('justas@maziliauskas.lt', 'email')
         ->type('hello1', 'password')
         ->type('hello1', 'password_confirmation')
         ->press('Register')
         ->seePageIs('/dashboard');
}
vagrant@homestead:~/projects/meetup-tests$ gulp
[09:35:46] Using gulpfile ~/projects/meetup-tests/gulpfile.js
[09:35:46] Starting 'default'...
[09:35:46] Starting 'phpUnit'...

Starting test 'ExampleTest::testBasicExample'.
.
Starting test 'FormSubmitTest::testNewUserRegistration'.
F

There was 1 failure:

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'http://localhost/dashboard'
+'http://localhost/home'

1) FormSubmitTest::testNewUserRegistration
Did not land on expected page [http://localhost/dashboard].

FAILURES!
Tests: 2, Assertions: 8, Failures: 1.
[09:35:47] gulp-notify: [Red!] Your phpUnit tests failed!
[09:35:47] Finished 'phpUnit' after 985 ms
protected $redirectPath = '/dashboard';

AuthController.php

vagrant@homestead:~/projects/meetup-tests$ gulp
[09:43:50] gulp-notify: [Green!] Your phpUnit tests passed!
[09:43:50] Finished 'phpUnit' after 1.2 s
vagrant@homestead:~/projects/meetup-tests$ gulp

There was 1 failure:

1) FormSubmitTest::testNewUserRegistration
Did not land on expected page [http://localhost/dashboard].

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'http://localhost/dashboard'
+'http://localhost/auth/register'
[09:44:35] gulp-notify: [Red!] Your phpUnit tests failed!
[09:44:35] Finished 'phpUnit' after 1.72 s

ONE MORE TIME

?

vagrant@homestead:~/projects/meetup-tests$ pa tinker
Psy Shell v0.6.1 (PHP 5.6.15-1+deb.sury.org~trusty+1 — cli) by Justin Hileman
>>> \App\User::all();
=> Illuminate\Database\Eloquent\Collection {#683
     all: [
       App\User {#684
         id: 1,
         name: "Justas",
         email: "justas@maziliauskas.lt",
         created_at: "2015-11-27 10:27:25",
         updated_at: "2015-11-27 10:27:25",
       },
     ],
   }
>>> q
Exit:  Goodbye.
protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
        'password' => 'required|confirmed|min:6',
    ]);
}
class FormSubmitTest extends TestCase
{
    use DatabaseTransactions;

    public function testNewUserRegistration()
    {
        $this->visit('auth/register')
             ->type('Justas', 'name')
             ->type('justas@maziliauskas.lt', 'email')
             ->type('hello1', 'password')
             ->type('hello1', 'password_confirmation')
             ->press('Register')
             ->seePageIs('/dashboard');
    }
}
vagrant@homestead:~/projects/meetup-tests$ gulp
[09:43:50] gulp-notify: [Green!] Your phpUnit tests passed!
[09:43:50] Finished 'phpUnit' after 1.2 s
vagrant@homestead:~/projects/meetup-tests$ gulp
[09:44:50] gulp-notify: [Green!] Your phpUnit tests passed!
[09:44:50] Finished 'phpUnit' after 1.3 s
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'users'
AND table_schema = DATABASE( ) ;

// 1
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'users'
AND table_schema = DATABASE( ) ;

// 2
class FormSubmitTest extends TestCase
{
    use DatabaseMigrations;

    public function testNewUserRegistration()
    {
        $this->visit('auth/register')
             ->type('Justas', 'name')
             ->type('justas@maziliauskas.lt', 'email')
             ->type('hello1', 'password')
             ->type('hello1', 'password_confirmation')
             ->press('Register')
             ->seePageIs('/dashboard');
    }
}
vagrant@homestead:~/projects/meetup-tests$ gulp
[09:43:50] gulp-notify: [Green!] Your phpUnit tests passed!
[09:43:50] Finished 'phpUnit' after 3 s
vagrant@homestead:~/projects/meetup-tests$ gulp
[09:44:50] gulp-notify: [Green!] Your phpUnit tests passed!
[09:44:50] Finished 'phpUnit' after 2.8 s
SHOW TABLES;

// migrations
SHOW TABLES;

// migrations

API testavimas

API ??? :)

vagrant@homestead:~/projects/meetup-tests$ pa make:test APITest
Test created successfully.
vagrant@homestead:~/projects/meetup-tests$ pa make:model Post -m
Model created successfully.
Created Migration: 2015_11_27_112705_create_posts_table
vagrant@homestead:~/projects/meetup-tests$ pa make:controller PostsController
Controller created successfully.
// routes.php
resource('posts', 'PostsController', ['except' => ['create', 'edit']]);
// 2015_11_27_112705_create_posts_table.php
public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->text('body');
        $table->timestamps();
    });
}
class APITest extends TestCase
{
    use DatabaseMigrations; // new database every test
    use WithoutMiddleware; // CSRF token
}
seeJson($arr)
seeJsonEquals($arr)
assertResponseStatus($statusCode)
public function index()
{
    return Post::all();
}

//test
public function testPostsList()
{
    $this->visit('/posts')->seeJsonEquals([]);
}

[Green!] Your phpUnit tests passed!
public function store(Request $request)
{
    if (Post::create($request->all())) {
        return response(['created' => true], 201);
    }

    return response('ERROR', 500);
}

//test
public function testSavePost()
{
    $this->post('/posts', ['body' => 'Post Body'])
         ->seeJson(['created' => true,]);
}

[Green!] Your phpUnit tests passed!
public function store(Request $request)
{
    if (Post::create($request->all())) {
        return response(['created' => true], 201);
    }

    return response('ERROR', 500);
}

//test
public function testEmptySavePost()
{
    $this->post('/posts', ['body' => null])
         ->assertResponseStatus(500);
}

[Green!] Your phpUnit tests passed!
public function show($id)
{
    return Post::findOrFail($id);
}

//test
public function testShowPost()
{
    $post = \App\Post::create(['body' => 'Test Body']);
    $this->get('/posts/' . $post->id)
         ->seeJsonEquals($post->toArray());
}

[Green!] Your phpUnit tests passed!
public function show($id)
{
    return Post::findOrFail($id);
}

//test
public function testShowPost()
{
    $post = \App\Post::create(['body' => 'Test Body']);
    $this->get('/posts/' . $post->id)
         ->seeJsonEquals($post->toArray());
}

[Green!] Your phpUnit tests passed!
public function update(Request $request, $id)
{
    $post = Post::find($id);

    if ($post->update($request->all())) {
        return response()->json(['updated' => true]);
    };

    return response('ERROR', 500);
}

//test
public function testUpdatePost()
{
    $post = \App\Post::create(['body' => 'Test Body']);

    $this->patch('/posts/' . $post->id, ['body' => 'New Body'])
         ->seeJson(['updated' => true]);
}

[Green!] Your phpUnit tests passed!
public function destroy($id)
{
    Post::destroy($id);

    return response()->json(['deleted' => true]);
}

//test
public function testDestroyPost()
{
    $post = \App\Post::create(['body' => 'Test Body']);

    $this->delete('/posts/' . $post->id)
         ->seeJson(['deleted' => true]);

    $this->visit('/posts')
         ->seeJsonEquals([]);
}

[Green!] Your phpUnit tests passed!
vagrant@homestead:~/projects/meetup-tests$ gulp
[13:19:38] Using gulpfile ~/projects/meetup-tests/gulpfile.js
[13:19:38] Starting 'default'...
[13:19:38] Starting 'phpUnit'...

Fetching PhpUnit Source Files...
   - tests/**/*Test.php

[13:19:38] Finished 'default' after 18 ms
[13:19:38]

       *** Debug Cmd: ./vendor/bin/phpunit --colors --debug -c phpunit.xml ***

[13:19:40] PHPUnit 4.8.18 by Sebastian Bergmann and contributors.


Starting test 'APITest::testPostsList'.
.
Starting test 'APITest::testSavePost'.
.
Starting test 'APITest::testEmptySavePost'.
.
Starting test 'APITest::testShowPost'.
.
Starting test 'APITest::testUpdatePost'.
.
Starting test 'APITest::testDestroyPost'.
.
Starting test 'ExampleTest::testBasicExample'.
.
Starting test 'FormSubmitTest::testNewUserRegistration'.
.

Time: 1.83 seconds, Memory: 23.25Mb

OK (8 tests, 17 assertions)
[13:19:40] gulp-notify: [Green!] Your phpUnit tests passed!
[13:19:40] Finished 'phpUnit' after 1.98 s

https://github.com/johnkary/phpunit-speedtrap

Kaip aš testuoju?

By Justas Maziliauskas