- 1 名前:nobodyさん [2014/03/01(土) 17:03:24.57 ID:8AJ9GD6E]
- CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです
CakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ 質問するときはCakePHPのバージョンを書きましょう ※他フレームワークとの比較等はスレ違いです ■本家 www.cakephp.org/ APIドキュメント api.cakephp.org/ github - cakephp github.com/cakephp the Bakery bakery.cakephp.org/ Issue cakephp.lighthouseapp.com/dashboard CheatSheet[1.2] (PDF) cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf ■日本語公式 cakephp.jp/ フォーラム cakephp.jp/modules/newbb/ cookbook(マニュアル) [2.x] book.cakephp.org/2.0/ja/index.html [1.3] book.cakephp.org/ja ※前スレ kohada.2ch.net/test/read.cgi/php/1378659370/
- 433 名前:nobodyさん mailto:sage [2014/05/12(月) 12:18:35.60 ID:???]
- >>432
スキーマ、レコード、moveUp moveDown のコード、クエリ この辺を貼り付けてみて
- 434 名前:nobodyさん mailto:sage [2014/05/12(月) 12:38:18.89 ID:???]
- CakePHPって3でActiveRecordを採用するんだったよな
- 435 名前:nobodyさん mailto:sage [2014/05/12(月) 13:15:30.27 ID:???]
- >>433
DBやレコードはお客のやつなんでまずいんです。ごめんなさい。 スキーマにはちゃんと parent_id, lft, righ の定義はしてあって、moveUp, moveDown以外のツリー動作は 問題なく動作しています。 public function moveup($id = null) { $this->Category->id = $id; $res = $this->Category->moveUp($this->Category->id, abs(1)) ; debug($res); }
- 436 名前:nobodyさん mailto:sage [2014/05/12(月) 13:24:21.16 ID:???]
- >>431
CakePHPのモデルが状態を持ってることが、むしろ混乱の元になってる気がするけどな。 ループ内でsaveするならcreateしろ、とか。 結局find()したら連想配列を返すし、save()だってモデルにデータ持たせたりせずsave()に引数渡すことばかりじゃない? よく使うfindとsaveで違和感を感じるだけで、インスタンスである必要な機能もあるけど。 まぁ言いたい事はたぶん >>426 と似たようなことなんだろうけど、 ほかのフレームワークをあまり触ってないから、違和感レベルでしか語れない。
- 437 名前:nobodyさん mailto:sage [2014/05/12(月) 13:36:54.55 ID:???]
- >>435
じゃぁ、verify() した結果を見たらヒントがあるかも debug($this->Category->verify()); どこかで整合性が崩れてると実行されない可能性有り。
- 438 名前:nobodyさん mailto:sage [2014/05/12(月) 13:49:48.47 ID:???]
- >>437
ありがとうございます。試してみました。 verify()でしばらくかかりましたが、真っ白な画面がリターンされました。 これはツリーに不整合などの異常がなかったということですよね。
- 439 名前:nobodyさん mailto:sage [2014/05/12(月) 14:00:55.26 ID:???]
- >>438
時間かかってなおかつ白い画面ってことはタイムアウトですね。 かなり大きいんですね。 成功すれば bool(true) が返る。 Shell でやってログに書き込んで確認してみたらいいかも。
- 440 名前:nobodyさん mailto:sage [2014/05/12(月) 14:03:28.70 ID:???]
- タイムアウトで白い画面って・・・もしかして本番環境・・・?
- 441 名前:nobodyさん mailto:sage [2014/05/12(月) 14:04:31.37 ID:???]
- TreeBehavior 適用してるテーブルに他のモデルから更新したら
整合性グチャグチャになるから注意
- 442 名前:nobodyさん mailto:sage [2014/05/12(月) 14:10:08.15 ID:???]
- >>439
ありがとうございます。お察しの通りノードが3万以上あるツリーなのです。 白画面はタイムアウトですか。勉強になりました。 TeraTermからサーバにログインし curl コマンドでverifyのURLにアクセスしましたが、 ブラウザから呼んだ時とは違い、瞬時にプロンプトが返ってきてしまいます。 シェルでverifyを実行とは、具体的にはどうすればいいのでしょうか?
- 443 名前:nobodyさん mailto:sage [2014/05/12(月) 14:11:10.17 ID:???]
- >>440
いいえ、本番のデータをまるまるコピーしてきましたが、デバッグ環境です。
- 444 名前:nobodyさん mailto:sage [2014/05/12(月) 14:12:13.34 ID:???]
- >>441
他のモデルからTreeを適応しているテーブルには書き込みしに行っておりません。
- 445 名前:nobodyさん mailto:sage [2014/05/12(月) 14:13:55.11 ID:???]
- debug=2でタイムアウトしたら
Fatal error: Maximum execution time of 30 seconds exceeded in ってでないっけ?
- 446 名前:nobodyさん mailto:sage [2014/05/12(月) 14:15:27.41 ID:???]
- >>445
Configure::write('debug', 2); でやりましたが、白画面でした。
- 447 名前:nobodyさん mailto:sage [2014/05/12(月) 14:27:56.28 ID:???]
- Console/commant/VerifyHogeShell.php
classVerifyHogeShell extends AppShell { protected function result() { $Hoge = ClassRegistry::init('Hoge'); return $Hoge->verify(); } public function show() { debug($this->result()); } public function dump() { //!TODO ログに書き込むロジックを記述 } } こんなファイルを作って $Console/cake VerifyHoge show とか $Console/cake VerifyHoge dump とか Shell の作り方・使い方はぐぐれば幾らでも出てくる
- 448 名前:nobodyさん mailto:sage [2014/05/12(月) 14:31:07.10 ID:???]
- >>442
cURLからアクセスしても最大実行時間は一緒だ。 コンソールからPHPプロセスを利用しなきゃ。 php のユーザーが誰かってことが抜け落ちてる。
- 449 名前:447 mailto:sage [2014/05/12(月) 14:32:38.76 ID:???]
- 1行目ミスった
>Console/commant/VerifyHogeShell.php Console/Command/VerifyHogeShell.php
- 450 名前:nobodyさん mailto:sage [2014/05/12(月) 14:37:04.67 ID:???]
- >>447
>>448 ありがとうございます! AppShellなるクラスが用意されていたのですね。知りませんでした。 さっそく試してみます。
- 451 名前:447 mailto:sage [2014/05/12(月) 14:41:43.59 ID:???]
- TeraTerm ってことは Windows か。
わかってるだろうけどコマンドのディレクトリセパレータは / じゃなくて \ な。
- 452 名前:nobodyさん mailto:sage [2014/05/12(月) 15:16:40.76 ID:???]
- >>447
>>448 verify()をShellから実行した結果、180超のエラーが出力されました。 特に多いのは index missingというやつです。 recover() で回復できますでしょうか?
- 453 名前:nobodyさん mailto:sage [2014/05/12(月) 15:22:02.02 ID:???]
- >>452
以前自分も同じようになったときは、 recover()で上手く言った場合とそうでない場合とがあった。 上手く行かなかったときは時間もなかったんで、 独自でスクリプト書いてで lft と rght を振り直した。 すまんが深く探ってないんで、それ以上詳しいことはよく分からん。 一度やってみろとしか言えない。
- 454 名前:nobodyさん mailto:sage [2014/05/12(月) 15:24:38.22 ID:???]
- あと、verify() でエラーが出たってことは
これからも同じ問題が発生するおそれがあるんで、 更新処理を全て点検したほうがいいな。 テストを良く書けているかどうかで、こういうときに大きく差が出る。
- 455 名前:nobodyさん mailto:sage [2014/05/12(月) 15:27:51.20 ID:???]
- Treeビヘイビアを使ってカテゴリ管理って難しいよね。
不特定多数のカテゴリを扱うとかなったら、 今回のような問題が起きてしまう可能性があるし
- 456 名前:nobodyさん mailto:sage [2014/05/12(月) 15:28:47.24 ID:???]
- 連投すまんが、今の状態だと recover 走らせる時もめちゃくちゃ時間かかるはずだから、
必ず Shell から実行すること。 更新中にタイムアウトなんかしたら(特にMySQLのMyISAMなどは)やっかいなことになる。
- 457 名前:nobodyさん mailto:sage [2014/05/12(月) 15:35:37.85 ID:???]
- >>455
入れ子集合モデルは更新コストが激高だからな。 場合に応じて使い分けるしか無いと思われ。
- 458 名前:nobodyさん mailto:sage [2014/05/12(月) 15:38:35.35 ID:???]
- >>453-456
アドバイスありがとうございます。 >これからも同じ問題が発生するおそれがあるんで、 お客が不正に行ったデータのInsertなどが原因だった可能性もありますが、 プログラムのほうも確認しておきます。 recover()もShellから実行しました。案外完了が早かったように思います。 今2度目のverify()です。
- 459 名前:nobodyさん mailto:sage [2014/05/12(月) 16:13:23.60 ID:???]
- >>453
verify()でtrueが返りました! moveUp()をあるノードで実行して結果をdebug文で出すとtrueが返りました。 しかし、treeには何の変化もなし!ノードの位置は一切変わっていません。 なぜなのでしょうか・・・。
- 460 名前:459 mailto:sage [2014/05/12(月) 16:28:51.15 ID:???]
- 連投で申し訳ありませんが、moveUp(), moveDonw()の仕様を根本的に勘違いしていました。
bookを読むと 同じ枝の中で順番を上に上げるのがmoveUp()なのですね。 僕はそもそもmoveUp()したノードは「一つ階層を上がって、今までの親ノードと同じ階層に来る」 ということを実現するものなのかと勘違いしておりました。 申し訳ありませんでした。しかしverify, recoverをshellから実行するなどの貴重な情報が得られて 感謝です。
- 461 名前:nobodyさん mailto:sage [2014/05/12(月) 16:30:16.90 ID:???]
- 階層を変えるなら parent_id を変更する
- 462 名前:nobodyさん mailto:sage [2014/05/12(月) 16:31:48.27 ID:???]
- >>461
そうですよね。 しかしparent_idを手でいじって、lft, rghtがそのままで良いのかというのが気になる点です。
- 463 名前:nobodyさん mailto:sage [2014/05/12(月) 16:32:41.62 ID:???]
- >>460
ちょっと興味あるんだが、レコード何件あんの?
- 464 名前:nobodyさん mailto:sage [2014/05/12(月) 16:33:45.39 ID:???]
- >>462
>parent_idを手でいじって ちがーーーう! TreeBehaviorが効いてるモデルでやるんだよ!!
- 465 名前:nobodyさん mailto:sage [2014/05/12(月) 16:38:21.01 ID:???]
- >>463
3万件超あります。 >>464 もちろん、DBから直接parent_idを変えたりしませんよ。 CakephpのEdit画面(もちろんTreeのモデルのもの)から変えます。
- 466 名前:nobodyさん mailto:sage [2014/05/12(月) 17:32:11.61 ID:???]
- >>463
んん、3万件オーバーでTreeBehaviorか。。。 ブラウザからの更新はちょっとキツイかもな。
- 467 名前:nobodyさん mailto:sage [2014/05/12(月) 17:34:01.92 ID:???]
- >>465
>CakephpのEdit画面(もちろんTreeのモデルのもの)から変えます。 なら問題なく lft, rght 変更してくれる。 っつーか、それがTreeBehaviorの仕事だからな。
- 468 名前:nobodyさん mailto:sage [2014/05/12(月) 17:45:37.30 ID:???]
- 改めて思うけど、カテゴリの設計って難しすぎるな
- 469 名前:nobodyさん mailto:sage [2014/05/12(月) 17:54:12.62 ID:???]
- >>466-468
ありがとうございます。 parent_idを変更すると、思っていた階層の移動が完了できました。ご迷惑をおかけしました。 カテゴリはこれからも増えていく可能性があるので、 このままTreeBehaviorを実装していて安全なのかちょっと心配しています。 親子関係を実現するには普通にHABTMでもいいのではないかな、と思いましたが、 設計段階でTreeの採用が決まっていたので、これで作ってしまっています。 データ件数がでかくなった今、非常にデリケートなデータ構造なんだな、と改めて認識しております。
- 470 名前:nobodyさん mailto:sage [2014/05/12(月) 18:14:56.49 ID:???]
- >>468
さらにそれを管理してくのが苦痛。
- 471 名前:nobodyさん mailto:sage [2014/05/12(月) 18:30:07.53 ID:???]
- >>469
親子関係でHABTMってどうやるんだ
- 472 名前:nobodyさん mailto:sage [2014/05/12(月) 19:01:06.74 ID:???]
- >>471
・categories ・articles ・category_articles(中間テーブル) みたいなテーブルを作る
- 473 名前:nobodyさん mailto:sage [2014/05/12(月) 19:02:02.02 ID:???]
- ごめん。中間テーブルの名前を間違えた。
categories_articlesだったかな。
- 474 名前:nobodyさん mailto:sage [2014/05/12(月) 19:42:05.93 ID:???]
- >>471
Categoryモデルの中に public $belongsTo = array('Parent' => array('className' => 'Category',)); public $hasMany = array('Children' => array('className' => 'Category')); と二つ記述するやりかたですかね。 それを最初に思いついたのです。 しかしTreeのほうが上ではないかという意見が出たため、そっちを採用しました。
- 475 名前:nobodyさん mailto:sage [2014/05/12(月) 19:50:22.00 ID:???]
- >>471
だからHABTMじゃないですね。ごめんなさい。 言うならばHas Many and Belongs to Oneでしょうか。
- 476 名前:nobodyさん mailto:sage [2014/05/13(火) 16:37:41.63 ID:???]
- ありゃ、もう2.5.0出たのか。
なんか最近CakePHPのバージョンあがるの早い気がするけど、気のせいか?
- 477 名前:nobodyさん mailto:sage [2014/05/13(火) 16:39:47.73 ID:???]
- >>476
年取っただけだと思う。 時代の流れが早く感じるよな。
- 478 名前:nobodyさん mailto:sage [2014/05/13(火) 16:44:46.95 ID:???]
- 2.6も予定されてるのかよ。
さっさと3出して、2は打ち止めでいいだろ。
- 479 名前:nobodyさん mailto:sage [2014/05/13(火) 17:43:09.45 ID:???]
- 今のCakeって$usesに書いてあるモデルは実際使われるまで読まれないんだよね?
ということは存在する全モデルを常に書いてもいいってこと?
- 480 名前:nobodyさん mailto:sage [2014/05/13(火) 18:12:50.09 ID:???]
- ぜんぜん良くはねーと思うが、負荷にはならんだろうな
- 481 名前:nobodyさん mailto:sage [2014/05/13(火) 22:34:11.52 ID:???]
- >>479
「今の」ってバージョンいくつからそうなったの?
- 482 名前:nobodyさん mailto:sage [2014/05/13(火) 22:43:15.01 ID:???]
- 2.x
- 483 名前:nobodyさん mailto:sage [2014/05/14(水) 00:35:48.56 ID:???]
- サンクス。普段は2系使ってるから特に問題ないな
- 484 名前:nobodyさん mailto:sage [2014/05/14(水) 02:38:22.28 ID:???]
- プログラミングするとき3行毎に動作確認しないと
不安で死ぬやつって俺だけ?
- 485 名前:nobodyさん mailto:sage [2014/05/14(水) 04:51:26.28 ID:???]
- 3行は短すぎるが、ちゃんと小さい処理単位でメソッドを分けておけば、
まとめて動作確認してもデバッグしやすいよ。 あとはテストを書け
- 486 名前:nobodyさん mailto:sage [2014/05/14(水) 07:02:10.89 ID:???]
- そんなあなたにテストファースト
- 487 名前:nobodyさん mailto:sage [2014/05/14(水) 10:05:36.21 ID:???]
- ぶっちゃけ、テストの利点が分からないの俺だけ?
- 488 名前:nobodyさん mailto:sage [2014/05/14(水) 10:09:17.84 ID:???]
- さすがに君だけじゃない?
- 489 名前:nobodyさん mailto:sage [2014/05/14(水) 11:29:01.43 ID:???]
- 最初のうちは、いまいちわからんかもね。
インターフェースのテストで、mockの使い方がわかってくるようになると、考え方が変わるかも。
- 490 名前:nobodyさん mailto:sage [2014/05/14(水) 12:33:17.82 ID:???]
- >>489
俺も教えて欲しいんだけど テスト書くのが面倒 テスト自体信用できない 書いてもやっぱり最初から書きたくなる って思ってしまうんだけどそれでも書いた方がいいと思う? できるプログラマーの人はみんな書いてるよね。
- 491 名前:nobodyさん mailto:sage [2014/05/14(水) 12:42:45.04 ID:???]
- >>490
結論としては書くべきでFA そのことがわかるには経験が必要 てことだと思う
- 492 名前:nobodyさん mailto:sage [2014/05/14(水) 12:51:30.16 ID:???]
- サービスが稼動を始めてから、数ヶ月経った後くらいに、
誰かのひどいコードを見つけた時、 テストを書いてあれば・・・と思うよ。
- 493 名前:nobodyさん mailto:sage [2014/05/14(水) 13:38:02.11 ID:???]
- view (.ctp) ファイルのテストってどうやってやるんだろう。
- 494 名前:nobodyさん mailto:sage [2014/05/14(水) 14:02:28.89 ID:???]
- そこまでテストする必要があるのかはよく考えたほうが良いように思えるけど、
やるならSelenium使うんじゃない?
- 495 名前:nobodyさん mailto:sage [2014/05/14(水) 14:08:25.34 ID:???]
- テスト=コードが正しく動作するか確かめる
ではないんだよね?これはブラウザで確認すればいいだけだし、 大体はコード書いた後に実行して確かめているだろ。 具体的にどういう場面でテストが必要になるの?
- 496 名前:nobodyさん mailto:sage [2014/05/14(水) 17:09:00.17 ID:???]
- ユニットテストとユーザテストごっちゃにしている時点でなんだかな。
- 497 名前:nobodyさん mailto:sage [2014/05/14(水) 17:52:25.48 ID:???]
- >>495
> 大体はコード書いた後に実行して確かめているだろ。 一度書き捨てて終わらせられるなら誰も書く訳がない 改修は何度も発生する=確認も同じだけ発生する=クッソ面倒 だから面倒な確認を自動化するためにテストを作るんだ
- 498 名前:nobodyさん mailto:sage [2014/05/14(水) 20:45:44.91 ID:???]
- というよりさ!
まずテストコードってなんなの? console.log()とは違うの?
- 499 名前:nobodyさん mailto:sage [2014/05/14(水) 21:02:32.76 ID:???]
- お前のテスト(むしろconsoleデバッグ?)
→ 逐一人の手で実行して人間がブラウザやconsoleに表示された値やを見て想定したものかどうか確認する 自動化できてない 複数の関数やメソッドが絡むとバグの原因の特定がしづらい 他の皆の意図するテスト(単体テスト) → それぞれの関数やメソッドが複数の引数のパターンに対し適切な返り値を返したり 例外やエラーを吐いたりなど仕様通りの挙動をするかを確かめるコードを書く 検証する対象が小さいので比較的簡単に書けるし自動化も容易い プログラムの小さい単位の動作をあらかじめ保証しておくことで 後の複数の関数やメソッドが絡むテストの際にもバグの原因の特定がしやすくなる 面倒だから単体テストでググれ
- 500 名前:nobodyさん mailto:sage [2014/05/14(水) 21:19:27.30 ID:???]
- さっぱり意味が分からん
- 501 名前:nobodyさん mailto:sage [2014/05/14(水) 21:51:05.96 ID:???]
- 例えば「足し算」ていうメソッドを作成したとする。
これは引数に例えば「1と2を入れると3が返る」というもの。 1「テストを書かないやりかた」 こんな簡単なメソッド、どうやってもミスるわけない。 とりあえず作る。最初に動くか確認する。 動いた・・・終わり 2「テストを書くやりかた」 「1と2を入力すると3が返る」というテストを書く。 開発しながらテストを走らせて正常か確認する。 テストが異常なら、異常がなくなるまでプログラムを修正する。 これをずっと繰り返す。 3「テストを先に書くやり方」 2のテストを先に書く。メソッドは空からスタート。 テストが通るまで開発を行う。
- 502 名前:nobodyさん mailto:sage [2014/05/14(水) 21:56:32.40 ID:???]
- console.logは、phpでいえばvar_dumpとかになるなんだろうが、
使うときにコメントイン/アウトしなきゃいけないし、消し忘れるとそれがそのまま出力されて大変なことになる(センシティブな情報だったら・・・)。
- 503 名前:nobodyさん mailto:sage [2014/05/14(水) 22:52:25.27 ID:???]
- 上司がテストケース書いて、部下にそれに合うようなコードを書かせるってのなら良いと思う。
ただcakephp1が2になったりするとテストも書き直しだよね。 結局テスト書いてもそれ以上にプログラムの進歩が速いような気もするんだよね。 ちなみにヤフーとかって10年前くらいにcgiをphpに書き直したみたいなこと聞いたけど、あれ以来書き換えてないのかな。 それとも地道に書き換えまくってるのかな?
- 504 名前:nobodyさん mailto:sage [2014/05/14(水) 23:08:58.07 ID:???]
- >ただcakephp1が2になったりするとテストも書き直しだよね。
いきなりスパン長い話になってね? ビジネスロジックまで全部変わるわけじゃないんだからテストコードも一部はそのまま使えるでしょ テストコードまったくなしに書きなおすよりはいくらか書きやすいと思う
- 505 名前:nobodyさん mailto:sage [2014/05/14(水) 23:36:50.08 ID:???]
- >>499の説明で合ってるんだが、何がわからないのかわからない
- 506 名前:nobodyさん mailto:sage [2014/05/14(水) 23:52:50.14 ID:???]
- >>504
ありがとう。そういうメリットもあるんですね。 >>505 わからない人にとっては全くわからないんだよね。テストケースのメリット。 俺、gitもテストケースも使ったことないというか使えないので勉強します。
- 507 名前:nobodyさん mailto:sage [2014/05/15(木) 00:48:57.49 ID:???]
- なんだかんだ言って教えるのなw
- 508 名前:nobodyさん mailto:sage [2014/05/15(木) 01:04:25.59 ID:???]
- 経験ないとわからないかもしれんね
愚者は経験に学ぶと言うけど人間なんて全員愚者だから、がんばって経験を積もう
- 509 名前:nobodyさん mailto:sage [2014/05/15(木) 02:16:19.81 ID:???]
- >>495
こういう >>492 時に必要になるんだよ。 例えば1日の区切りが0時じゃなく4時なサービスがあるとしよう。 DateTimeオブジェクトや日時の文字列を受けて、何日かを返すメソッドがあるんだけど、 中身を見たらこりゃひどい実装だなという時、 テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。
- 510 名前:nobodyさん mailto:sage [2014/05/15(木) 03:48:38.98 ID:???]
- お前ら俺が以前テストの質問した時はスルーしたくせに
テストの話題で盛り上がりやがって
- 511 名前:nobodyさん mailto:sage [2014/05/15(木) 04:08:36.66 ID:???]
- >>510
たぶんそれから必死で勉強したんだよ
- 512 名前:nobodyさん mailto:sage [2014/05/15(木) 10:33:38.61 ID:???]
- >>509
>中身を見たらこりゃひどい実装だなという時、 >テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。 ここが想像できないんだよ。中身(モデル?)が酷い実装っていうけど、 前は動いてたんだよな?それを変更する時に「酷い」が分かるんだろ? なら、テストも書き直しだと思うんだよ。俺も>>503と同じ疑問を持ってる。 Cakeのバージョンアップではなくとも、仕様が変わればテストも変わるでしょ。
- 513 名前:nobodyさん mailto:sage [2014/05/15(木) 10:45:22.44 ID:???]
- 0か1で考えてんな
少なくとも単体テストしやすいように設計してれば 仕様を変えた部分の他に影響がないことを保証しやすいんじゃないか テストが書いてない誰かが作ったソフトウェアを改修する時に あっち変えたらこっち動かなくなったよみたいな経験ない?
- 514 名前:nobodyさん mailto:sage [2014/05/15(木) 10:52:06.00 ID:???]
- んじゃあ次はgitってなんなのよ?
- 515 名前:nobodyさん mailto:sage [2014/05/15(木) 11:08:32.04 ID:???]
- >>514
俺も思うな。 一人で開発したことしかないからか、 前に戻したくなることなんてまず無い。 毎回、add、commitする手間の方が面倒な気がするけど。 ただ、いつでも何処にでも戻せる安心感ってのは大きいのかもしれない。 dropboxでも戻せるけどどこに戻せば良いのかすらわからない。
- 516 名前:nobodyさん mailto:sage [2014/05/15(木) 11:14:00.56 ID:???]
- >>512
別人だけど、中身ってコードのこと言ってるんだろ。 テストが完璧な仕様を表したものだと仮定すると、 テスト通りに動く限りは、実装コードはいくら変えても構わない、という理屈。 テストコードの方も変える必要がない(というか、変えたら同一の保証ができなくなる)。 もっとも、リファクタリングの過程で、新しいクラスやインターフェースを追加、とかなることが多いから、 その場合は、テストも変えていく必要はあるけど。
- 517 名前:nobodyさん mailto:sage [2014/05/15(木) 11:25:10.47 ID:???]
- バージョン管理してないとかマジか
まあ趣味で小規模のものならそれでもいいのかな…
- 518 名前:nobodyさん mailto:sage [2014/05/15(木) 11:31:50.75 ID:???]
- >>515
一人で開発を数年やってるが仕事でも個人サービスでもgitは重宝してる 過去ログとして何をやったかが残ること。 複数同時に機能開発ができること。 gitなしにはもう生きられない。 テストはControllerのテストは書かない。 それより下位層は書いてる。 自分が書いたコードを忘れたころに重宝してる。 他の機能実装のために、さらに下位層を変更したときに重宝してる。 デプロイツールもなしには生きられんな。
- 519 名前:nobodyさん mailto:sage [2014/05/15(木) 11:48:03.50 ID:???]
- >>517
残念ながら商用で10以上の製品を扱ってるんだ・・。 gitの前にSubversionを勉強したこともあったけど、 バージョン管理の利点があまり思いつかないんだよな。バックアップ以外で。 マイナーアップデートしてそれをgitで管理する程度ならいいだろうけど、 開発してたら頻繁に更新するわけだろ?コード間違えも多々ある。 なのに、どのタイミングでadd、commitするか分からんし、 毎回してたら515が言うように面倒だ。
- 520 名前:nobodyさん mailto:sage [2014/05/15(木) 11:52:50.01 ID:???]
- >>513
例えばこの2ちゃんの掲示板。 名前とメールアドレスと本文入れて投稿すれば掲載される。 この一連の処理が正しく行われるかのテストを書くわけだろ? で、そこに「画像を追加できる」という機能が加わったとする。 コントローラーとモデルとビューにコードを追加し、テストも書き直すよな? なら、またテストのやり直しだ。
- 521 名前:nobodyさん mailto:sage [2014/05/15(木) 12:25:34.42 ID:???]
- >>520
テストにもいろいろ種類があるが、ここで書け書け言われてるのは、 単体テストと呼ばれるやつな。 で、単体テストの場合、一連の処理をテストするんじゃなくて、 機能単位でテストする。 俺も理解は甘いから、機能単位と言い切って良いのかわからないけど。 なので >>509 のようなメソッドは、戻り値だけに着目すればよくて、テストが書きやすいんだけど、 コントローラーのテストはちょっと書きにくい。 コントローラーのメソッドはアクションで、実行されたあとの結果がいろいろあるからな。
- 522 名前:nobodyさん mailto:sage [2014/05/15(木) 12:37:38.37 ID:???]
- >>520
あえて掲示板ということで、CommentsControllerのaddメソッドのテストで考えてみると 1 必須項目を省いてPOSTしたら、書けてない事 2 書き込み成功していいPOSTなら、書けてる事 3 名前を省略したら「nobodyさん」になる事 もっとあるとは思うけど、addメソッドのテストとして、こんなのを確認するテストを書いたとする。 「画像を追加できる」機能が必須項目じゃなければ、「画像を追加できる」を実装した後も、 このテストは3つの部分は期待通りに動いてることを確認できると思う。 で、画像を追加する投稿についてのテストをいくつか追記して、機能追加が完成できる。 この場合あくまでテストは追記だから、テストは書き直しとは言わないと思う。 画像が必須項目だったとしたら、1と2は書き直しになっちゃうだろうけど、これも微修正って範疇じゃないかと。
- 523 名前:nobodyさん mailto:sage [2014/05/15(木) 13:17:55.24 ID:???]
- gitって、dropboxと違い
commitやマージが便利そうだな。
- 524 名前:nobodyさん mailto:sage [2014/05/15(木) 13:33:34.19 ID:???]
- >>522
物凄く分かりやすい!参考になった。 つまり、その1〜3をこれまではブラウザでいちいち実行してたのを テストコードさえ用意しておけば、自動で成否を出してくれるって事だよね? それならテストを追加する意味もあるし、すごく便利だと思う。
- 525 名前:nobodyさん mailto:sage [2014/05/15(木) 16:23:27.92 ID:???]
- >>524
伝わったようで何よりだけど、あげておとすようで悪いが、 質問してた人が言ってたようなデメリットもやっぱりあるよ。 実装が大きく変われば、さすがにテストも修正というより書き直しになるし、 あとさっきも書いたけどコントローラーはテスト書きにくい。 仕様変更で実装が大きく変わりやすい箇所でもある。 あと >>522 この例でいうと、「画像を追加できる」機能を追加した際、 ぶっちゃけテストなんてなくても1〜3は壊れないような実装になりそうな気がすごいする。 俺としては >>509 のような、ユーティリティ的なライブラリが、テストも書きやすいし恩恵も多いと思う。 実際困ったから書いたんだけど、時間というテストがめんどくさいデータで、 結局動作確認するには、4時丁度とその前後や、逆に0時丁度やその前後を引数に、呼んでみるしかないから、それってテストコードだしな。 で、ユーティリティだからサービスのいろんな箇所で呼ばれてて、ミスったときの影響範囲も広い。 なので、テストコードがないと、修正に及び腰になってしまう。
- 526 名前:nobodyさん mailto:sage [2014/05/15(木) 16:45:41.71 ID:???]
- >>525
なんかよく分からなくなってきたな・・・。 コード書いて「こういうイメージ?」って聞こうとしたんだけど、 どう聞けばいいからすら分からず、固まってしまったよw
- 527 名前:nobodyさん mailto:sage [2014/05/15(木) 19:50:47.49 ID:???]
- ここはなんのスレですか?
- 528 名前:nobodyさん mailto:sage [2014/05/15(木) 19:53:03.77 ID:???]
- スレタイ読めないの?CakePHPのスレですよ?
ちなみにCakePHPにテストという機能がちゃんと用意されてますよ? だからその事について話し合っているんですよ?
- 529 名前:nobodyさん mailto:sage [2014/05/15(木) 20:27:14.89 ID:???]
- >>528
くわしく
- 530 名前:nobodyさん mailto:sage [2014/05/15(木) 20:53:28.94 ID:???]
- >>529
book.cakephp.org/2.0/ja/development/testing.html
- 531 名前:nobodyさん mailto:sage [2014/05/15(木) 23:34:57.49 ID:???]
- >>525
テストコードがないと及び腰ってのすごくわかる。 自分が作ったコードですら触りたくないもん。
- 532 名前:nobodyさん mailto:sage [2014/05/16(金) 13:54:12.18 ID:???]
- では、先生方次は最近よく聞く
composerについて教えて下さい。
- 533 名前:nobodyさん mailto:sage [2014/05/16(金) 14:02:22.96 ID:???]
- あとで知ったかで話すから、ちょっと勉強する時間をくれ
|

|