Share
Embed
Transcript
24 slides
-
APIςετͷॻ͖ํ ▸ ΦϑΟγϟϧͷυΩϡϝϯτʹͬͯΔͷͰ͓͞Β͍ఔͰ ▸ LumenͷTestCase(ݫີʹMakesHttpRequests Trait) ▸ jsonϝιουܦ༝ͰControllerΛݺͼग़͠ ▸ Traitʹอ࣋͞ΕͨResponseΛseeJsonEqualsͱ͔ͬ
ͯAssertion͢Δ ▸ seeJsonEqualsͰExpectͱActualͷ݁ՌΛιʔτͯ͠ൺ ֱ͢ΔͷͰॱ൪Λؾʹ͢Δඞཁ͕ͳ͍ -
APIςετͷॻ͖ํ use Concerns\InteractsWithContainer, Concerns\MakesHttpRequests, Concerns\InteractsWithAuthentication, Concerns\InteractsWithConsole, Concerns\InteractsWithDatabase, Concerns\InteractsWithSession, Concerns\MocksApplicationServices; ▸
༨ஊ) ConcernsΛίϐʔ͢Ε4ܥͰಉ͜͡ͱ͕Ͱ͖Δ public function testTest() { $this->json('GET', '/me', []); $this->seeJsonEquals([ 'id' => 1, 'name' => 'Shaka', ]); } TESTCODE SAMPLE -
֎෦ґଘͷऔΓѻ͍ ▸ DatabaseMigrations Trait ▸ DatabaseTransactions Trait ▸ DBΛmockͤͣʹςετ͢Δ͜ͱ͕Ͱ͖Δ ▸
ςετέʔε͝ͱʹMigrationͯ͠DB SchemaΛߋ৽ͨ͠ Γ ▸ ςετέʔεશମʹTransactionΛ͔͚ͯςετؒͰͷ σʔλͷӨڹΛແͨ͘͠Γ ֎෦ґଘ DATABASE -
֎෦ґଘͷऔΓѻ͍ ▸ 1݅ͣͭmake͢Δඞཁ͕͋ͬͯΊΜͲ͏͍͘͞ ▸ ςετσʔλ͕ଟ͘ͳΔͱͭΒ͍ $factory->define(ModelName::class, function (Faker\Generator $faker) {
return ['id' => 1, 'status' => 1,]; }); $factory->state(ModelName::class, ‘state_name’, function (Faker\Generator $faker) { return ['status' => 2,]; }); FACTORYͰςετσʔλੜ -
֎෦ґଘͷऔΓѻ͍ ▸ ҰԠ͜͏͍͏Γํ… $factory->define(ModelName::class, function (Faker\Generator $faker) { ModelName::query()->insert([ ['id'
=> 1, 'status' => 1,], ['id' => 2, 'status' => 2,], ]); // modelͷattributeΛฦ͞ͳ͍ͱ͍͚ͳ͍ return [ 'id' => 3, 'status' => 3, ]; }); ▸ ͜͜·Ͱ͢ΔͳΒSeedͬͨΒ͍͍ͷͰ… -
֎෦ґଘͷऔΓѻ͍ MIGRATION ▸ ςετΛ࣮ߦ͢ΔલʹSchemaΛ࠷৽ʹอͭඞཁ͕͋Δ ▸ ςετέʔε͝ͱʹMigrationΛ࣮ߦͰ͖Δ͕ɾɾɾ ▸ αʔϏε͕Ͱ͔͘ͳΔͱMigration͕͘ͳͬͨΓrollback͕ յΕ͍ͯͨΓ ▸
͔ͳΓ͍ (खݩͰ1class࣮ߦ͢Δͷʹ18ඵ͔͔ͬͨ) ▸ ͏ͪͷ߹MigrationϑΝΠϧ͕APIϦϙδτϦʹແ͍ͷͰͦ ͦͰ͖ͳ͍ -
֎෦ґଘͷऔΓѻ͍ SQLITE ▸ ͦΜͳ͋ͳͨʹSQLite ▸ ࠷৽ͷSchemaͷঢ়ଶͷDBΛ࡞͓͍ͬͯͯϝϯόʔͱڞ༗Ͱ ͖Δ ▸ ࣮ମ͕୯ҰͷόΠφϦϑΝΠϧͳͷͰgitͰཧͰ͖Δ ▸
ʮSQLite DBΛੜ͢ΔεΫϦϓτʯΛ࡞͓͚ͬͯίϯϑ ϦΫτؾʹ͠ͳͯ͘ྑ͘ͳΔ ͏ͪͰͬͯΔartisanίϚϯυஔ͍ͱ͍ͨͷͰݟ͍ͨํͲ͏ͧ IUUQCJUMZ)'09 -
֎෦ґଘͷऔΓѻ͍ ▸ SQLite(pdo_sqlite)ͰσʔλΛऔಘ͢Δͱͯ͢stringͰฦͬͯ͘ ΔͷͰҙ ▸ mysqlndint/stringͳͲΧϥϜͷͷܕʹ߹Θͤͯฦͯ͘͠ΕΔ ▸ intͷΛ === ͰఆΛ͍ͯ͠Δ߹յΕΔ…ͷͰcastsΛॻ͘
ඞཁ͕͋Δɻਖ਼͔ͬͨΔ͍ class MyModelName extends Model { protected $casts = [ 'id' => 'int', 'name' => 'string', ]; } -
֎෦ґଘͷऔΓѻ͍ ▸ ֎෦APIΛݺͿΤϯυϙΠϯτͷςετͳͲ ▸ Facebook Maketing APIΛίʔϧ͢ΔAPIͷςετͳΜ͔ ॻ͍ͯ·͕͍͢ͷͰಛఆͷλΠϛϯάͰ͔࣮͠ߦ͠ͳ͍Α ͏ʹ͍ͯ͠·͢ ▸
ςετͷ࣮ߦ࣌ؒͱ͔֎෦APIͷ༷ʹґଘ͢ΔͷͰͦͷล Λߟྀͯ͠Ͳ͏͢Δ͔ܾΊΔͱྑ͍͔ͱ ▸ ඞཁͳ͍߹ؤுͬͯmock͢Δ ֎෦ґଘ 3RD PARTY SERVICE -
API DOCUMENTS ▸ Swaggerͱ͔ͷ ▸ ͏ͪҎԼͷཧ༝ͰSwaggerΛࣺͯͯapiDocΛͬͯ·͢ ▸ DocΛݟΔͨΊʹyamlϑΝΠϧ͕ඞཁʹͳͬͯखؒ ▸ σϑΥϧτͰੜͰ͖Δ੩తϖʔδͷσβΠϯ͕͋Μ·Γ
͖͡Όͳ͍(ݸਓͷײͰ͢) ▸ SwaggerͷίʔυࣗಈੜػೳΛ·͍ͬͨͬͯ͘ͳ͍ API DOCUMENTATION Swaggerͷཧղ͕ո͍͠Մೳੑ͕͋ΔͷͰؒҧͬͯͨΒ͝ΊΜͳ͍͞ -
API DOCUMENTS ▸ apiDoc ▸ σβΠϯ͕؆ૉͰݟ௨͕͠ྑ͍ ▸ ੩తϑΝΠϧΛϏϧυ͢Ε(ૹΓ͚ͭΕ)ϩʔΧϧͰ ݟΕΔ ▸
Ϗϧυָ͕ ▸ ίʔυ(Doc Comment)ʹυΩϡϝϯτ͕͋ΔͷͰߋ৽ ͠ͳ͍ͱ͍͚ͳ͍ؾ࣋ͪʹͳΔ -
API DOCUMENTS /** * @param Request $request * @param $id
* @return \Illuminate\Http\JsonResponse * * @api {get} /user/:user_id get user info * @apiName indexDynamicAdCreativeName * @apiDescription Get user info * @apiGroup User * * @apiParam {Number} user_id User ID * @apiParam {Number} [status] Status key * @apiSuccess {Number} id ID * @apiSuccess {String} name User Name */ APIDOC SAMPLE -
API DOCUMENTS public function testTest() { $request = [ ‘name’
=> ‘updated_name’, ]; $expectedResponse = [ 'id' => 1, 'name' => 'updated_name', ]; $this->json(‘PUT', '/me', $request); $this->seeJsonEquals($expectedResponse); } -
API DOCUMENTS DOCUMENT GENERATION SAMPLE protected $generateApiDoc = true; public
function json($method, $uri, array $request = [], array $headers = [] { if (!$this->generateApiDoc) { return parent::json($method, $uri, $request, $headers); } $self = parent::json($method, $uri, $request, $headers); $response = json_decode($this->response->getContent()); $apiDocGenerator = new ApiDocGenerator(); $apiDocGenerator->setParser(new ApidocjsParser()) ->setFormat(new ApiDocFormatter()); @$apiDocGenerator->generate($request, $response); return $self; }