Slide 1

Slide 1 text

Unit Testing Laravel nunulk Laravel Meetup Okinawa ୈ7ճ

Slide 2

Slide 2 text

ຊ೔࿩͢͜ͱ w ࣗݾ঺հ w Ϣχοτςετͱ͸ w 1)16OJUʹ͍ͭͯ w -BSBWFMʹΑΔ1)16OJUͷ֦ுػೳʹ͍ͭͯ w ςετͷ༏ઌॱҐʹ͍ͭͯ

Slide 3

Slide 3 text

ࣗݾ঺հ

Slide 4

Slide 4 text

ࣗݾ঺հ • nunulkʢ͵͵Δ͘ʣ • ౦ژ͔Βདྷ·ͨ͠ʢ4ധ5೔ʣ • ϑϦʔϥϯεͷϓϩάϥϚʢࡾྲྀʣ • ޷͖ͳٕज़: PHP/Laravel/TypeScript/Vue.js/Elixir/ Scala/Nim

Slide 5

Slide 5 text

Ϣχοτςετ

Slide 6

Slide 6 text

Ϣχοτςετͱ͸ w Ϋϥε΍ؔ਺ʢϝιουʣ୯ҐͰ࡞੒͠ɺͦͷΫϥε΍ ؔ਺ͷॲཧΛςετ͢Δ w ϗϫΠτϘοΫεςετΛ࡞੒͢Δʢ৚݅෼ذɺೖྗύϥ ϝʔλͷ಺༰ʹґଘ͢Δॲཧʣ w ϒϥοΫϘοΫεςετΛ࡞੒͢Δʢ૝ఆ͞ΕΔೖྗύϥ ϝʔλ͔ΒύλʔϯΛબͿɻڥք஋ɺҟৗ஋ɺFUDʣ w ґଘؔ܎͸ϞοΫ΍ελϒͰஔ͖׵͑Δ

Slide 7

Slide 7 text

Ϣχοτςετʹదͨ͠γνϡΤʔγϣϯ w ܭࢉ w ৚݅൑ఆ w ม׵

Slide 8

Slide 8 text

Ϣχοτςετͷྫʢܭࢉʣ // test public function testRemainingHousrs() { $today = Carbon::today(); $task = factory(Task::class)->make([ 'due' => Carbon::tomorrow() ]); $this->assertSame(24, $task->remainingHours($today)); } // production public function remainingHours(Carbon $datetime): int { return $this->due->diffInHours($datetime); }

Slide 9

Slide 9 text

Ϣχοτςετͷྫʢ৚݅൑ఆʣ // test public function testIsOverdue() { $now = Carbon::now(); $task = factory(Task::class)->make([ 'due' => Carbon::yesterday() ]); $this->assertTrue($task->isOverdue($now)); } // production public function isOverdue(Carbon $datetime): bool { return $this->due->lessThan($datetime); }

Slide 10

Slide 10 text

Ϣχοτςετͷྫʢม׵ʣ public function testToArrayInvisiblePassword() { $user = factory(User::class)->make(); $this->assertArrayNotHasKey('password', $user->toArray()); $this->assertArrayHasKey('email', $user->toArray()); }

Slide 11

Slide 11 text

PHPUnit

Slide 12

Slide 12 text

PHPUnit w ΞαʔγϣϯBTTFSU&RVBMT BTTFSU4BNF BTTFSU5SVF  BTTFSU'BMTF BTTFSU$POUBJOT BTTFSU/VMM BTTFSU5IBU FUD w Ξϊςʔγϣϯ!EBUB1SPWJEFS !FYQFDUFE&YDFQUJPO  !HSPVQ FUD w ίʔυΧόϨοδ

Slide 13

Slide 13 text

LaravelʹΑΔ֦ு

Slide 14

Slide 14 text

PHPUnit in Laravel w .PDLFSZ 'BLFSΛόϯυϧ w .PEFM'BDUPSZ 'BLFS w 'BDBEF .PDLFSZ w %*ίϯςφΛ࢖ͬͨ.PDLJOH w ศརτϨΠτ *OUFSBDUT8JUI"VUIFOUJDBUJPO  .PDLT"QQMJDBUJPO4FSWJDFT  *OUFSBDUT8JUI%BUBCBTF3FGSFTI%BUBCBTF  %BUBCBTF5SBOTBDUJPOT FUD

Slide 15

Slide 15 text

Mockery $task = factory(Task::class)
 ->states(['doing', 'high'])
 ->create(); Mockery::mock(TaskRepository::class) ->shouldReceive('find')
 ->once()
 ->andReturn($task); Mockery::mock(Log::class) ->shouldReceive(‘debug')
 ->once() ->andReturnUsing(function ($subject, $body) { // ͜ͷதͰΞαʔγϣϯ͕Ͱ͖·͢ $this->assertContains('Laravel', $body); });

Slide 16

Slide 16 text

Model Factory, Faker $factory->define(Task::class, function (Faker $faker) { return [ 'subject' => $faker->sentence, 'priority' => Priority::default(), 'status' => Status::default(), ]; }); $factory->state(Task::class, 'doing', function () { return [ 'status' => Status::DOING(), ]; }); factory(Task::class)->states(['doing', 'high'])->create();

Slide 17

Slide 17 text

ςετͷ༏ઌॱҐ

Slide 18

Slide 18 text

ςετͷ༏ઌॱҐ  ΞϓϦέʔγϣϯͷେࣄͳ෦෼ʢ͓ۚͱ͔ʣʹؔΘΔॲ ཧ
 ˠ࣮֬ʹνΣοΫ͢ΔͨΊʹࣗಈԽ  ೖग़ྗ΍ܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧ
 ˠͨ͘͞Μςετ͢Δͷ͕ΊΜͲ͍͘͞ͷͰࣗಈԽ  ࢓༷มߋ͕ೖΓ΍͍͢ॲཧ
 ˠมΘΔͨͼʹςετ͢Δͷ͕ΊΜͲ͍͘͞ͷͰࣗಈԽ

Slide 19

Slide 19 text

·ͱΊ w -BSBWFMͳΒΦʔϧΠϯϫϯύοέʔδͳςετ͕Ͱ͖Δ w ܭࢉɺ൑ఆɺม׵Λ΍ΔͳΒϢχοτςετΛॻ͜͏ w ΞϓϦέʔγϣϯͷେࣄͳ෦෼ʢ͓ۚͱ͔ʣʹؔΘΔॲཧɺ ೖग़ྗ΍ܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧɺ࢓༷มߋ ͕ೖΓ΍͍͢ॲཧΛॻ͘ͳΒϢχοτςετΛॻ͜͏