Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Code igniter + ci phpunit-test
Report
ME iBotch
Follow
May. 29, 2016
•
0 likes
2 likes
×
Be the first to like this
Show More
•
4,565 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Check these out next
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
ざっくり解説 LINE ログイン
Naohiro Fujie
世界一わかりやすいClean Architecture
Atsushi Nakamura
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
Ruby でつくる型付き Ruby
mametter
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
20171005 告白に学ぶ http status code
Shinichi Takahashi
1
of
64
Top clipped slide
Code igniter + ci phpunit-test
May. 29, 2016
•
0 likes
2 likes
×
Be the first to like this
Show More
•
4,565 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Engineering
Nagoya OpenSource Conference 2016 CodeIgniter+ci-phpunit-test
ME iBotch
Follow
Advertisement
Advertisement
Advertisement
Recommended
C#とILとネイティブと
信之 岩永
26K views
•
63 slides
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
Masahiro Nagano
18.3K views
•
37 slides
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
59.8K views
•
82 slides
ELFの動的リンク
7shi
17.9K views
•
52 slides
ドメイン駆動設計の正しい歩き方
増田 亨
25.1K views
•
61 slides
第11回ACRiウェビナー_東工大/坂本先生ご講演資料
直久 住川
188 views
•
27 slides
More Related Content
Slideshows for you
(20)
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
•
73.9K views
ざっくり解説 LINE ログイン
Naohiro Fujie
•
947 views
世界一わかりやすいClean Architecture
Atsushi Nakamura
•
45.1K views
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
•
29.5K views
Ruby でつくる型付き Ruby
mametter
•
3K views
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
•
121.8K views
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
•
14.2K views
20171005 告白に学ぶ http status code
Shinichi Takahashi
•
11K views
関数型言語ElixirのIoTシステム開発への展開
Hideki Takase
•
1K views
Qiita Night 足場固めからやるマイクロサービス
Tomoki Kuriyama
•
159 views
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
Natsuki Yamanaka
•
11.6K views
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
•
2.9K views
【Unity道場】ゲーム制作に使う数学を学習しよう
Unity Technologies Japan K.K.
•
28.9K views
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
•
7.6K views
CRC-32
7shi
•
29.3K views
プログラマ目線から見たRDMAのメリットとその応用例について
Masanori Itoh
•
5.1K views
どこに何を書くのか?
pospome
•
7.5K views
A quick tour of the Cysharp OSS
Yoshifumi Kawai
•
57.6K views
ドメイン駆動設計 基本を理解する
増田 亨
•
116.9K views
正しいものを正しく作る塾-設計コース
増田 亨
•
9.4K views
Viewers also liked
(20)
Codeigniter4の比較と検証
ME iBotch
•
6.7K views
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
ichikaway
•
7.8K views
Wocker 秒速で WordPress 開発環境を構築する
Kite Koga
•
8.5K views
FuelPHP × HHVM サービス開発事例
Yuji Otani
•
5.1K views
Idcfクラウド 初心者の事始め(2)資料
Takako Miyagawa
•
1.6K views
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
Hiroshi Toda
•
3.4K views
PHPカンファレンス2016 協賛のご案内
裕介 原田
•
3.4K views
2017 02-14 キュー実装に見る排他処理
Akishige TAKEKOSHI
•
2.5K views
PHPCON fukuoka 2015 CodeIgniter update
Takako Miyagawa
•
14.5K views
OmegaTでドキュメント翻訳
Takako Miyagawa
•
3K views
REST API Best Practices & Implementing in Codeigniter
Sachin G Kulkarni
•
39.3K views
RESTful API Design & Implementation with CodeIgniter PHP Framework
Bo-Yi Wu
•
59.7K views
Proyecto ASHYI
Jesús Antonio Quiñones
•
518 views
Opinieartikel FD: Nederlandse pensioensector staat met rug naar Europa
Jeroen de Bruin
•
414 views
טיפים לחשיבת הצלחה לכבוד 2017
edith naaman - digital content management
•
305 views
Género y desastres en Chile-Itzá Castañeda
ComunidadMujer Cm
•
929 views
Revue de presse IoT / Data du 04/03/2017
Romain Bochet
•
401 views
0620 w15 qp_11
Omniya Jay
•
2.5K views
Webinar: 5 Things to Prepare Your Company for Growth - 2-time CEO, Matt Peterson
Matt Peterson
•
293 views
Cancer
Sangram Chandgudé
•
568 views
Advertisement
Similar to Code igniter + ci phpunit-test
(20)
Php勉強会資料20090629
Takako Miyagawa
•
928 views
PHPカンファレンス関西 2011
Takako Miyagawa
•
2K views
CodeIgniter をモダンに改造してみた
Masaru Matsuo
•
5.2K views
MicroPythonのCモジュールを作ってみる
Kenta IDA
•
1.4K views
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
DIVE INTO CODE Corp.
•
233 views
パターンでわかる! .NET Coreの非同期処理
Kouji Matsui
•
20.9K views
Desktop app dev strategy for .net core 3.0
Atsushi Nakamura
•
11.6K views
Codeigniter3フレームアップデート
tomohiro kitaura
•
10.8K views
14対話bot発表資料
Keiichirou Miyamoto
•
1.7K views
Netmf-180224
Atomu Hidaka
•
495 views
Blockchain EXE #16:Hyperledger fabricの技術動向とファイナンシャルエンジニアリング視点でのトークンエコノミー|平山 毅...
blockchainexe
•
1.3K views
CodeIgniterのライセンスについて
Takako Miyagawa
•
45.1K views
Botkit4.x Has Come!
Hikaru Uchiyama
•
415 views
初めてのWebプログラミング講座
DIVE INTO CODE Corp.
•
344 views
CodeIgniter 最新情報 2011 (増補版)
kenjis
•
1.5K views
Visual Studio Code で C# でのアプリ開発
m ishizaki
•
8.6K views
Bot Framework Emulator はこんなにすごい
Yoshitaka Seo
•
958 views
ET2016 Smart Japan Alliance Llilum 161118
Atomu Hidaka
•
141 views
初めてのWebプログラミング講座
DIVE INTO CODE Corp.
•
194 views
IBM Rational Team Concertに触れてみた
You&I
•
1.8K views
Recently uploaded
(20)
揭秘英国留学:如何获得利物浦大学毕业证?
yatenf
•
2 views
★可查可存档〖制作斯伯丁大学文凭证书毕业证〗
vgfg1
•
2 views
Radio03(1995).pdf
ivan ion
•
5 views
《萨斯喀彻温大学毕业证|学位证书校内仿真版本》
124hdjkhas
•
3 views
★可查可存档〖制作南安普顿大学文凭证书毕业证〗
vgfg1
•
2 views
揭秘美国留学:如何获得阿拉斯加大学毕业证?
xefexep
•
2 views
★可查可存档〖制作杜伦大学文凭证书毕业证〗
vgfg1
•
2 views
《勒芒大学毕业证|学位证书校内仿真版本》
hj123saf
•
2 views
★可查可存档〖制作卡尔顿大学文凭证书毕业证〗
mmmm282537
•
2 views
《戴尔豪斯大学毕业证|学位证书校内仿真版本》
124hdjkhas
•
3 views
揭秘新西兰留学:如何获得惠灵顿维多利亚大学毕业证?
hzdcyty
•
2 views
★可查可存档〖制作奥克兰商学院文凭证书毕业证〗
tujjj
•
2 views
무료스포츠중계 〔www,rtЗЗ,top〕코드 b77 플레이보이카지노 ㋁ 황제카지노 ㉤ 나미비아 국가경기 Ⓣ afc윔블던 ㈭ 퀴라소 ㈗ 축구...
ssusere9c2b4
•
0 views
★可查可存档〖制作国立大学文凭证书毕业证〗
tujjj
•
2 views
★可查可存档〖制作贝桑松大学文凭证书毕业证〗
tujjj
•
2 views
★可查可存档〖制作萨福克大学文凭证书毕业证〗
vvvvv24
•
3 views
Radio06(1995).pdf
ivan ion
•
2 views
Supliment5-Radio09(1995).pdf
ivan ion
•
3 views
《天普大学毕业证|学位证书校内仿真版本》
d520dasw12
•
2 views
在哪里可以做《巴黎第十二大大学文凭证书|毕业证》
kjds1245
•
2 views
Advertisement
Code igniter + ci phpunit-test
CodeIgniter + ci-phpunit-test 2016/05/28 Tetsuro
Yoshikawa 1 / 64
目次 1. CodeIgniterについて 2. ci-phpunit-testについて 3.
テストの書き方 4. まとめ こんな内容話します。 2 / 64
CodeIgniterって何? EllisLabによって開発されたPHP FWです。 ※現在のオーナーはBCIT(ブリティッシュコロンビア工科大学) https://www.codeigniter.com/ 3 /
64
ライセンス MIT アーキテクチャに関するデザインパターン MVC 生成に関するデザインパターン Singletonっぽい 動作要件 PHP 5.2.4以上(5.4以上推奨) 4 /
64
CodeIgniterの人気 長期にわたる根強い人気があります! 5 / 64
CodeIgniterのいいところ 6 / 64
CodeIgniterのいいところ 名前がかっこいい 速い・軽い 規約がゆるい 拡張しやすい 学習コストが低い(読みやすい) etc.. 7 / 64
CodeIgniterのわるいところ 8 / 64
CodeIgniterのわるいところ ない 強いてあげるなら、デフォルトではnamespaceが無い事ぐらいです。 (個人の感想であり個人差があります。) 9 / 64
テストってどうやっているの? 10 / 64
CodeIgniterでは Unitテストクラスが実装されています。 11 / 64
Unitテストクラスでのテスト <?php class Auth_model_test extends CI_Controller { public function __construct() { parent::__construct(); if ( ENVIRONMENT !== 'production' ) show_404(); $this‐>load‐>library('unit_test'); } public function test_is_loggedin() { $this‐>load‐>model('auth_model'); $result = $this‐>auth_model‐>is_loggedin(); echo $this‐>unit‐>run($result, FALSE, 'Auth_model::is_loggedin'); } } 12 / 64
PHPUnit使えないの? 13 / 64
使えます。 そう、ci-phpunit-testならね。 14 / 64
使えます。 そう、ci-phpunit-testならね。 https://github.com/kenjis/ci-phpunit-test 15 / 64
ci-phpunit-testのいいところ 16 / 64
ci-phpunit-testのいいところ PHPUnitでテストできる OSS(MITライセンス) 開発者は日本で唯一のCodeIgniter専門書籍の著者(Made in Japan) require_onceとか書かなくて良い テストする物によって親クラスが別れる等が無い 今のところ書けないテストが無かった 動かす為にCodeIgniter本体に手を入れる必要が無い Mockとかが書くのが楽 etc 17
/ 64
ci-phpunit-testのわるいところ 18 / 64
ci-phpunit-testのわるいところ ない (個人の感想であり個人差があります。) 19 / 64
ci-phpunit-testって どうやって導入するの? $ cd CodeIgniter設置場所(CI index.php ) $ composer require kenjis/ci‐phpunit‐test ‐‐dev $ php vendor/kenjis/ci‐phpunit‐test/install.php これでapplications/testsにてテストが書ける様になっています。 20
/ 64
実際にコードをご覧下さい。 21 / 64
Modelのテストコード 22 / 64
<?php class Test_model_test extends TestCase { public function setUp() { $this‐>resetInstance(); $this‐>CI‐>load‐>model('Test_model'); $this‐>obj = $this‐>CI‐>Test_model; //obj 変数 model
代入 } public function test_get_list() { $assert_list = [ 1 => 'hogehoge', 2 => 'fugafuga' ]; $list = $this‐>obj‐>get_list(); foreach ( $list as $val ) { $this‐>assertEquals($assert_list[$val‐>id], $val‐>name); } } } 23 / 64
Controllerのテストコード <?php class Hoge_test extends TestCase { public function test_index() { //request method 設定 controller
書 $output = $this‐>request('GET', 'hoge/index'); $this‐>assertContains('<title>hogehoge</title>', $output); } } 24 / 64
パラメータ渡してるんだけど controllers/Hoge.php <?php class Hoge extends CI_Controller { public function index() { $this‐>load‐>view('hoge/index'); } } views/hoge/index.php <!DOCTYPE html> <html lang="ja"> <meta charset="UTF‐8"> <title></title> <span><?php echo html_escape($this‐>input‐>post('foo'));?></span> </html> 25 / 64
<?php class Hoge_test extends TestCase { public function test_index() { //第三引数 渡 $output = $this‐>request('POST', 'hoge/index', [ 'foo' => 'bar' ]); $this‐>assertContains('<span>bar</span>', $output); } } string型で読み込みストリームへパラメータを渡す事もできます。 また、第二引数にstring型でGETパラメータを渡す事もできます。 26 /
64
404のテストしたいんだけど <?php class Welcome_test extends TestCase { public function test_404() { $this‐>request('GET', 'welcome/_hogehoge'); $this‐>assertResponseCode(404); } } assertResponseCodeでレスポンスのテストをする事ができます。 27 / 64
Mock作りたいんだけど 28 / 64
PHPUnitでのMock作成 <?php class Auth_model_test extends PHPUnit_Framework_TestCase { //... public function test_is_loggedin() { //Mock 作成 $mock = $this‐>getMockBuilder('Auth_model') ‐>setMethods('is_loggedin') ‐>getMock(); //返 値
設定 $mock‐>expects($this‐>any()) ‐>method('is_loggedin') ‐>willRetrun(TRUE); $this‐>assertTrue($mock‐>is_loggedin()); } } 29 / 64
<?php class Dashboard_test extends TestCase { public function test_index() { $this‐>request‐>setCallable(function($CI){ // 判定用 // getMockBuilder('Auth_model') // ‐>setMethods('is_loggedin') // ‐>getMock() 必要 $auth = $this‐>getDouble('Auth_model', ['is_loggedin' => TRUE]); $CI‐>auth_model = $auth; }); $output = $this‐>request('GET', 'dashboard/index'); $this‐>assertContains('認証済', $output); } } getDoubleで簡単にMock作成 ControllerのテストではsetCallableでMockをセット 30
/ 64
DBからSELECTしてるんだけど 大容量だからテストに15分とかかかる 31 / 64
<?php class Hoge_model extends CI_Model { public function get_large_capacity() { $this‐>db‐>select('id'); $this‐>db‐>join('(SELECT SLEEP(900)) AS SL ', '1 = 1', 'LEFT', FALSE); $query = $this‐>db‐>get('large_capacity'); return $query‐>result(); } } 32 / 64
<?php class Hoge_model extends CI_Model { public function get_large_capacity() { $this‐>db‐>select('id'); $this‐>db‐>join('(SELECT SLEEP(900)) AS SL ', '1 = 1', 'LEFT', FALSE); $query = $this‐>db‐>get('large_capacity'); return $query‐>result(); } } 謎のSLEEP 33 / 64
<?php class Hoge_model_test extends TestCase { public function test_get_large_capacity() { //返 値 設定 $return = [(object)['id' => 1]]; //CI
DB driver 訳 Mock作成 $db_result = $this‐>getDouble('CI_DB_pdo_result', [ 'result' => $return ]); $db = $this‐>getDouble('CI_DB_pdo_mysql_driver', [ 'get' => $db_result ]); $this‐>verifyInvokedOnce($db_result, 'result',[]); $this‐>verifyInvokedOnce($db, 'get', ['large_capacity']); $this‐>obj‐>db = $db; $large_capacity = $this‐>obj‐>get_large_capacity(); $this‐>assertEquals($large_capacity[0]‐>id, 1); } } verifyInvokedOnceでどんな引数を渡しているかも検証 34 / 64
このコードどうテストしよう 35 / 64
<?php class Api_model extends CI_Model { public function get_api_key() { while (TRUE) { // mt_rand $result = md5(uniqid(mt_rand(), TRUE)); if ( ! $this‐>key_exists($result) ) break; } $this‐>add_api_key($result); return $result; } オブジェクトじゃないのでMockが作れない 36 /
64
強力なMonkeyPatch機能 (用法用量にご注意ください。) 37 / 64
<?php class Api_test extends TestCase { //... public function test_get_api_key() { //patchFunction 関数 挙動
制御 MonkeyPatch::patchFunction('md5', ' md5 ', 'Api_model::get_api_key'); $db_result = $this‐>getDouble('CI_DB_pdo_result', ['num_rows' => 0]); $db = $this‐>getDouble('CI_DB_pdo_mysql_driver', [ 'insert' => $db_result, 'get' => $db_result, 'where' => TRUE ]); $this‐>api_model‐>db = $db; $api_key = $this‐>api_model‐>get_api_key(); $this‐>assertEquals(' md5 ', $api_key); } patchFunctionでmd5の挙動を制御 38 / 64
さらにややこしい 39 / 64
<?php class Api_model extends CI_Model { //... public function create_random_key() { $result = md5(uniqid(mt_rand(), TRUE)); if (function_exists('random_bytes')) { // 中 $result = hash_hmac('sha256', random_bytes(32), random_bytes(16)); } elseif (function_exists('openssl_random_pseudo_bytes')) { // $result = hash_hmac('sha256', openssl_random_pseudo_bytes(32), openssl_random_pseudo_bytes(16)); } return $result; } 同じfunction_exists関数を使って判定している。 40 /
64
<?php class Api_test extends TestCase { //... public function test_create_random_key() { // 第2引数 指定 MonkeyPatch::patchFunction('function_exists', function($func){ return (bool)( $func !== 'random_bytes' ); }, 'Api_model::get_api_key'); MonkeyPatch::patchFunction('hash_hmac', 'openssl_random_pseudo_bytes
!', 'Api_model::get_api_key'); $api_key = $this‐>api_model‐>create_random_key(); $this‐>assertEquals('openssl_random_pseudo_bytes !', $api_key); } これもpatchFunctionで対応可能 41 / 64
constructorでログイン判定している <?php class Mypage extends CI_Controller { public function __construct() { parent::__construct(); $this‐>load‐>library('Ion_auth'); $this‐>load‐>helper('url_helper'); if ( ! $this‐>ion_auth‐>logged_in() ) { redirect('login'); } } } 42 / 64
CI_Controllerの読み出し前にロードさせる <?php class Mypage_test extends TestCase { public function test_index() { $this‐>setCallablePreConstructor(function(){ $auth = $this‐>getDouble( 'Ion_auth', ['logged_in' => TRUE] ); //CI load_class相当 動作
ion_auth Mock 挿入 load_class_instance('ion_auth', $auth); }); $output = $this‐>request('GET', 'mypage/index'); $this‐>assertContains('<span> </span>', $output); } } ci-phpunit-testのsetCallablePreConstructorでCI_Controller インスタ ンス生成前にhook 43 / 64
modelで認証してるんですが <?php class Mypage extends CI_Controller { public function __construct() { parent::__construct(); $this‐>load‐>model('auth_model'); $this‐>load‐>helper('url_helper'); if ( ! $this‐>auth_model‐>is_loggedin() ) { redirect('login'); } } } 44 / 64
MonkeyPatchを使いましょう <?php class Mypage_test extends TestCase { public function test_index() { MonkeyPatch::patchMethod('Auth_model', ['is_loggedin' => TRUE]); $output = $this‐>request('GET', 'mypage/index'); $this‐>assertContains('<span> </span>', $output); } } getDoubleみたいな書き方で設定できます。 45 /
64
定数によって 認証を振り分けている 46 / 64
<?php class Auth_model extends CI_Model { //... public function is_loggedin() { $uid = $this‐>session‐>userdata('user_id'); if ( ENVIRONMENT !== 'production' ) { $uid = 1; } if ( empty($uid) ) { return FALSE; } $user_data = $this‐>get($uid); return ( ! empty($user_data) ); } } 47 / 64
MonkeyPatchで定数も書き換え可能です。 <?php class Auth_model_test extends TestCase { //... public function test_is_loggedin_develop() { //development 置 換 MonkeyPatch::patchConstant('ENVIRONMENT', 'production', 'Auth_model::is_loggedin'); $sess_mock = $this‐>getDouble('CI_Session', ['userdata' => 2]); $this‐>auth_model‐>session = $sess_mock; $this‐>assertFalse($this‐>auth_model‐>is_loggedin()); } } 48
/ 64
ご注意!!! MonkeyPatchでは置き換える事のできない関数も存在します。 また、MonkeyPatchではテストが実行される直前にコードを差し替え ています。 そのため、テストの速度に良くない影響を与えます。 用法用量にはご注意ください。 49 / 64
書き方がわからない。 サンプルが欲しい。 50 / 64
Documentが揃ってます。 サンプルコードあります。 Document https://github.com/kenjis/ci-phpunit- test/blob/master/docs/HowToWriteTests.md サンプルコード https://github.com/kenjis/ci-app-for-ci-phpunit- test/tree/v0.12.0/application/tests 51 / 64
まとめ CodeIgniterでPHPUnitを動かすときはci-phpunit-testがオススメ Controllerはrequestメソッドがオススメ MockはgetDoubleメソッドがオススメ どうしようも無い時はMonkeyPatchで回避しましょう 書き方がわからないときはサンプルコードかドキュメントを読み ましょう 52 / 64
おまけ。SQLをテストしたい例 53 / 64
<?php class Hoge_model_test extends TestCase { public function test_get_large_capacity() { //返 値 設定 $return = [(object)['id' => 1]]; //CI
DB driver 訳 Mock作成 $db_result = $this‐>getDouble('CI_DB_pdo_result', [ 'result' => $return ]); $db = $this‐>getDouble('CI_DB_pdo_mysql_driver', [ 'get' => $db_result ]); $this‐>verifyInvokedOnce($db_result, 'result',[]); $this‐>verifyInvokedOnce($db, 'get', ['large_capacity']); $this‐>obj‐>db = $db; $large_capacity = $this‐>obj‐>get_large_capacity(); $this‐>assertEquals($large_capacity[0]‐>id, 1); } } さっきの15分かかるテストの例とは逆に 54 / 64
凄く複雑なSQLを使っているからSQLのテストも含めてテストした Seederのご紹介 ciphpunittestに同梱されているDBフィクスチャ用のライブ ラリ <?php class AuthSeeder extends Seeder { private $table = 'users'; public function run() { $this‐>db‐>truncate($this‐>table); $data = [ 'id' => 1, 'username' => 'unit_test', 'password' => 'unit_test' ]; $this‐>db‐>insert($this‐>table, $data); } } 55 / 64
テストコードでのSeederの呼び出し <?php class Auth_model_test extends TestCase { public function setUpBeforeClass() { parent::setUpBeforeClass(); $CI =& get_instance(); $CI‐>load‐>library('Seeder'); $CI‐>seeder‐>call('AuthSeeder'); } //... setUpやsetUpBeforeClass等でロードして呼び出すだけ ただし、CodeIgniterのDB Driverのテストがしたい訳では無いと思う ので使う事は稀です。 56 /
64
ci-phpunit-testで 良いCodeIgniterライフを 送りましょう! 57 / 64
自己紹介 Tetsuro Yoshikawa Twitter @iBotchME 株式会社音生 早朝意識弱い系マークアップエンジニア PHP(嗜む程度) HTML(少し) CSS(少々) JavaScript(嗜む程度) 58
/ 64
宣伝 日本CodeIgniterユーザ会では翻訳作業をしています!! 皆さんでCodeIgniterを盛り上げましょう! 翻訳方法 http://codeigniter-jp.github.io/user_guide_src_ja/ へアクセス 59 /
64
翻訳方法1 GitHubで修正をクリック 60 / 64
翻訳方法2 鉛筆ボタンのクリック 61 / 64
翻訳方法3 翻訳して「Propose file change」をクリック 62
/ 64
翻訳方法4 「Create pull request」をクリック 63
/ 64
翻訳方法まとめ 1. http://codeigniter-jp.github.io/user_guide_src_ja/ 2. 翻訳したいページでGitHubで修正をクリック 3.
GitHubにログインして鉛筆ボタンクリック 4. 翻訳して「Propose file change」をクリック 5. 確認して「Create pull request」をクリック 64 / 64
Advertisement