タグ

2012年1月25日のブックマーク (21件)

  • ぼくのかんがえた最強のテスト分類 - Articles Advent Calendar 2011 Test

    はじめに こんにちは!最近転職して新宿までロマンスカーにお世話になりっぱなしの ikasam_a です。 Test Track 3日目です!初日に xaicron さんから「テストの細かい話を書いて!」と言われたので、今日はちょっと趣向を変えて、テストの分類についてつらつらと書いてみたいと思います。 あまり、というかまったく Perl の話は出てこないです!さーせん! テストを分類すると捗るぞ 例えばチームでテストの話をするような時に、それぞれが考える「テスト」のイメージが違って、話が噛み合わないことがあったりしますよね。僕はよくありました。 僕は「テスト=単体テスト」の話をしているつもりが、相手は「テスト=機能テスト」だと思って話を進めていると、あれ?という場面があったりします。こういうときは、例えば設計におけるデザインパターンのように、テストをより具体的にした共通認識があると話が捗りま

    ぼくのかんがえた最強のテスト分類 - Articles Advent Calendar 2011 Test
    barlog
    barlog 2012/01/25
    3 最強のテスト分類考察
  • use Test::Attribute::AutoLevel - Articles Advent Calendar 2011 Test

    こんにちは、カワ(・∀・)イイ!!アイコンで有名なnekokakだよ。 今日はカワ(・∀・)イイ!!僕がつくったTest::Attribute::AutoLevelという イカしたモジュールを紹介してみたいと思うんだ。 僕はテストを書く時にテスト用の便利関数を定義することがよくあるんだ。 そのテスト関数の中でTest::Moreのテスト関数を実行するんだけど、 そこでテストがコケたときに表示されるエラーメッセージがおかしなことになるんだ。 例えば use strict; use warnings; use Test::More; sub test_cute_icon { my $icon = shift; is $icon->{state}, 'cute'; } { package My::Icon; sub new { my ($class, $opts) = @_; bless $op

    use Test::Attribute::AutoLevel - Articles Advent Calendar 2011 Test
    barlog
    barlog 2012/01/25
    2 Test::Attribute::AutoLevel
  • perl でテストを始めよう!! - Articles Advent Calendar 2011 Test

    はじめに こんにちはこんにちは!最近会社のモニターが二枚になって持て余している xaicron です。 さて、Test Track と称して始まったトラック。全部よめばあなたもテストを書かずには生きていけない、そんな身体に大変身していること間違いなしです。 とりあえず今日は初日なので、perl でテストを書くときに必ずと言っていいほど利用する Test::More を使ったテストの書き方を書こうと思ます。 また、「テスト」とざっくりといってもいろいろなものがありますが、その辺の細かい話はきっと ikasam_a さんが書いてくれるのでスルーします。 Test::More チートシート まず、More というだけあって、結構機能がいっぱいあるので、チートシートを先にあげておきます。perldoc Test::More のほぼコピペですが、きっと皆さんは perldoc Test::More

    perl でテストを始めよう!! - Articles Advent Calendar 2011 Test
    barlog
    barlog 2012/01/25
    1 Test チートシート付き
  • #19 標準Plugin1 - Articles Advent Calendar 2011 Teng

    Tengには標準で提供されているPlugin機構がいくつかあります。 今日はそれらの紹介をします。が、回数かせぎのために2回にわけます。 Lookup lookupメソッドを提供します。lookupメソッドはsingleメソッドと同等の機能を提供しますが、SQL::Makerを使わないため機能に制限がある代わりに高速に動作します。 SingleBySQL searchに対するsearch_by_sqlと同様に、singleに対するsingle_by_sqlを提供すします。 my $row = $teng->single_by_sql(q{select * from user where id = ?}, [1], 'user') 尚、LookupやSingleBySQLに対するベンチマークを行うlookup_vs_single.plが開発レポジトリにあります。結果は下記のようになっています

    #19 標準Plugin1 - Articles Advent Calendar 2011 Teng
  • #18 Plugin - Articles Advent Calendar 2011 Teng

    TengにはPlugin機構があります。 TengでPluginを書く為にはPlugin側でour @EXPORTを定義し、 そこにpluginとして提供したいメソッド名を書きます。 package Your::Plugin::Hello; use strict; use warnings; our @EXPORT = qw/say_hello/; sub say_hello { print "hello\n"; } 1; これだけでTengのPluginが完成です。 このPluginをつかうには以下のようにloadします。 package Proj::DB; use strict; use warnings; use parent 'Teng'; __PACKAGE__->load_plugin('+Your::Plugin::Hello'); 1; すると $teng->say_hel

    #18 Plugin - Articles Advent Calendar 2011 Teng
  • #16 transaction - Articles Advent Calendar 2011 Teng

    Tengではトランザクションの仕組みをDBIx::TransactionManagerに一任しています。 ですので、基的にはDBIx::TransactionManagerでのトランザクションのかけ方が Tengでのトランザクションのかけ方とほぼイコールです。 TengではDBIx::TransactionManagerに処理をデリゲーションしています。 DBIx::TransactionManagerはDBIx::SkinnyやDBIx::Handlerなど私が作ったDB周りの 他のモジュールでも使われているのを始め、他のDB関連モジュールなどでも 多く利用されるようになってきました。 Tengでトランザクションをかけるには以下のように行います。 $teng->txn_begin; my $row = $teng->insert('user', +{id => 1, name => '

    #16 transaction - Articles Advent Calendar 2011 Teng
    barlog
    barlog 2012/01/25
    16 transaction
  • #15 schema migration - Articles Advent Calendar 2011 Teng

    マイグレーションというものについて私の考えをまとめてみたいと思います。 まず、マイグレーションの定義ですよね。 マイグレーションとはhttp://www.sophia-it.com/content/%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3 とかいろいろな意味があるんですが、ORMだったりdatabase周りで語られる場合は、 schemaのバージョン管理的な意味合いで良いと思います。 例えばMySQLで例を挙げますと、 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name_idx` (`name`)

    #15 schema migration - Articles Advent Calendar 2011 Teng
    barlog
    barlog 2012/01/25
    15 schema migration
  • #14 schema dumper - Articles Advent Calendar 2011 Teng

    先日Teng::Schema::Loaderの解説をしましたが、 TengにはTeng::Schema::Dumperというモジュールがあります。 Loaderはプログラム実行時に動的にdatabaseにschema情報を読み出し、 TengのSchemaクラスを構築しましたが、Dumperはdatabaseから読みだしたschema情報を Teng::Schea::Declare形式で出力し、ファイルに保存して利用することを目的としています。 多くのテーブル定義がある場合、手でSchemaクラスを書くのは大変なので、 ある程度処理を自動化デキルようになっているのです。 Teng::Schema::Dumperは以下のように利用します。 #! perl use strict; use warnings; use DBI; use Teng::Schema::Dumper; my $dbh

    #14 schema dumper - Articles Advent Calendar 2011 Teng
    barlog
    barlog 2012/01/25
    14 schema dumper
  • #13 schema meta data api - Articles Advent Calendar 2011 Teng

    schema meta data apiとは、Teng用に作ったSchema情報をプログラマブルに処理出来る機構とは 思ってもらえればよいかと思います。 DBIx::Skinnyからnamespaceを変えてまで作るきっかけになった仕組みの一つです。 DBIx::Skinnyではschemaの情報を操作するAPIというものが存在しておらず、 schema情報として管理されているhashrefを直接さわらないと内部の情報を操作することができませんでした。 その為、PluginなどのDBIx::Skinnyコア以外のサードパーティモジュールでschema辺りをhackしたい場合に DBIx::Skinny体の内部の仕様変更に弱くあまりイケテナイ感じになってしまっていました。 後付でAPIを足すことも可能なのですが、 そもそものschema情報がオブジェクト化されておらず、単なるデータの集まり

    #13 schema meta data api - Articles Advent Calendar 2011 Teng
  • #12 schema loader - Articles Advent Calendar 2011 Teng

    Tengではschemaクラスを定義することで insert / update / delete / single(etc..) などを簡単に取り合え使えるようになっています。 しかしテーブル数が多かったり、既にあるサービスのschema情報をクラスに落としこむ際、 手で書き起こすのはかなりしんどい作業になるでしょう。 そこでTengでは他のORMにもあるようにschemaを動的にloadしたりschemaクラス形式のデータをdumpしたりする 仕組みを提供しています。 今日はそのなかのloaderと呼ばれる動的schemaクラス読み込みについてを説明します。 Teng::Schema::Loader 動的にschema情報をdatabaseから読み出すのにTeng::Schema::Loaderを利用します。 今まではProj::DB::Schemaガある前提でしたがLoaderを使えば

    #12 schema loader - Articles Advent Calendar 2011 Teng
    barlog
    barlog 2012/01/25
    12 schema loader
  • #11 inflate / deflate - Articles Advent Calendar 2011 Teng

    deflateを辞書で引くと http://ejje.weblio.jp/content/deflate とあるように、ふくらんだものをすぼませるといった意味があります。 これも経済でいうデフレでインフレとは逆の意味でつかわれますね。 なのでdeflateはオブジェクトという構造体を単純な文字列のようなものに変換することを言います。 Tengでのinflate / deflate Tengではinflate / deflateの定義をschemaに書きます。 今回のinflate / deflateの例を持ち出すのにいまのschemaではものたりないのでuserテーブルにcreated_atとupdated_atというカラムを追加したいと思います。 追加した後のtable定義、schema定義はまずこうなります。 package Proj::DB::Schema; use strict;

    barlog
    barlog 2012/01/25
    11 inflate / deflate
  • #10 Rowクラスの拡張方法 - Articles Advent Calendar 2011 Teng

    Tengでdatabaseからデータを取得すると、基的には各レコードはTeng::Rowのオブジェクトになって返されます。 my $row = $teng->single('user', +{id => 1}); この時点の$rowはProj::DB::Row::Userというクラスでインスタンス化されています。 しかし今までの説明でProj::DB::Row::Userを定義したことはありませんでした。 Tengではtableに対応するRowクラスを自動的に生成し、利用します。 例えばこのProj::DB::Row::Userというクラスにメソッドを追加したいとします。 その場合は単純に自分でそのクラスを定義するだけです。 package Proj::DB::Row::User; use strict; use warnings; use parent 'Teng::Row'; sub

    #10 Rowクラスの拡張方法 - Articles Advent Calendar 2011 Teng
  • #09 update / delete - Articles Advent Calendar 2011 Teng

    Teng::Rowの説明でupdate / deleteの説明はしたのですが、update / deleteメソッドはTeng::Rowからだけでなく、 Teng自体からも実行可能なので軽く説明します。 $teng->update('user', +{name => 'inukaku'}, +{id => 1}); # UPDATE user SET name = 'inukaku' WHERE id = 1; このようにRowオブジェクト以外からもupdate文を実行することが可能です。 Rowオブジェクト経由だと、Rowオブジェクトが持っているPRIMARY KEYを使ったupdateしかできませんでしたが、 Tengオブジェクト経由だとupdateする条件を自分で指定することが可能です。 例えば以下のように条件を指定しなければ my $update_count = $teng->up

    barlog
    barlog 2012/01/25
    9 update / delete
  • #08 search - Articles Advent Calendar 2011 Teng

    今日はsearchメソッドを紹介します。 まず、searchメソッドはsingleのようにPRIMARY KEYで1行取得するわけではないが、 そんなに複雑じゃない場合に利用するといいと思います。 my $itr = $teng->search('user', +{name => 'nekokak'}, +{order_by => 'id'}); # SELECT * FROM user WHERE name = 'nekokak' ORDER BY id; のように利用します。 こうすることでnameがnekokakな人をまとめて取得しイテレータ経由でレコードにアクセス出来るようになります。 また、第三引数にオプションを指定でき、ORDER BYなどを指定すことが可能です。 LIMIT / OFFSETを指定したい場合は my $itr = $teng->search('user', +

    #08 search - Articles Advent Calendar 2011 Teng
    barlog
    barlog 2012/01/25
    8 search methods
  • #07 Teng::Iterator - Articles Advent Calendar 2011 Teng

    今日はデータ取得時に利用することになるTeng::Iteratorを紹介します。 single以外のsearch系のメソッドを利用すると基的にはTeng::Iteratorのオブジェクトが返されます。 TengのIteratorオブジェクトnext / all / suppress_object_creationというメソッドのみ提供されます。 next nextメソッドをつかうことで取得したrow情報をイテレーションしながら取得することができます。 while (my $row = $itr->next) { $row->id; } suppress_object_creation TengではRowオブジェクトを必要としない場合、もしくはRowオブジェクトの生成コストをカットして、 単なるhasrefを取得したい場合にsuppress_object_creationメソッドに真の値を

    #07 Teng::Iterator - Articles Advent Calendar 2011 Teng
    barlog
    barlog 2012/01/25
    7th Iterator //stretching
  • #06 search_by_sql / search_named - Articles Advent Calendar 2011 Teng

    Tengではsingleメソッドなどを使うと自分でSELECT文を書く必要が無く、 内部でクエリを自動生成し、databaseに問い合わせをおこないますが、 複雑なクエリ担ってきた場合、クエリビルダーをつかってSQLを生成すると問題が発生することがあります。 JOINするようなクエリをクエリビルダで生成する場合、 実際のPerlのロジックからどういうSQLが生成されるかを考えるのが以外に面倒だったりします。 まぁちょっと込み入ったクエリを発行したい場合は生のSQLを使うのが一番だと懐います。 そういった場合にTengではsearch_by_sqlメソッドを利用します。 my $itr = $teng->search_by_sql('select * from user where id = ?', [qw/1/]); search_by_sqlの返却値はTeng::Iteratorのオブジ

    barlog
    barlog 2012/01/25
  • #05 Teng::Row - Articles Advent Calendar 2011 Teng

    今日はTengでデータを取得した際に利用されるTeng::Rowについてを説明します。 先日までに説明したinsertメソッドやsingleメソッドで取得されるRowオブジェクトは、 Teng::Rowクラスを用いてオブジェクト化されています。 Teng::Rowクラスは、カラムデータをメソッド呼び出しで取得するなどの機能が備わっています。 my $row = $teng->single('name', +{id => 1}); $row->id; # 1 $row->name; # nekokak もし存在しないカラムをメソッドコールしてしまうと、 $row->age; 以下のような例外が発生し、処理が停止します。 Specified colum 'age' not found in row (query: SELECT "id", "name" FROM "user" WHERE ("

    #05 Teng::Row - Articles Advent Calendar 2011 Teng
    barlog
    barlog 2012/01/25
  • DeNA、HTML5開発支援フレームワーク「Arctic.js」を オープンソースとして公開 - [DeNA] 株式会社ディー・エヌ・エー

    株式会社ディー・エヌ・エー(社:東京都渋谷区、代表取締役社長:守安功、以下DeNA)は、人気ゲームタイトルで使用されているHTML5開発支援フレームワーク「Arctic.js」をオープンソースとして公開しました。 「Arctic.js」は、スマートフォン向けブラウザゲームにおけるインタラクティブなアクションゲーム操作や、複雑なアニメーション表現を支援するJavaScript*1フレームワークです。開発者は「Arctic.js」を用いてJavaScriptのコーディングを行うことで、短期間かつ一度の開発でAndroid*2とiOS*3双方の様々なスマートフォンデバイスへ高品質なゲームを提供することが可能になります。*4

  • #04 single - Articles Advent Calendar 2011 Teng

    Tengのsingleメソッドを利用すると、PRIMARY KEYだったりUNIQUE KEYを使って簡単に1レコード取得することができます。 返却値はRowオブジェクトとなります。 my $row = $teng->single('user', +{id => 1}); 簡単ですね。 実際に発行されるSQLは SELECT * FROM user WHERE id = 1 LIMIT 1; となります。 たとえば複数columnをPRIMARY KEYにしている場合、 my $row = $teng->single('user', +{id => 1, name => 'nekokak'}); として、複数の条件を指定することができます。 SELECT * FROM user WHERE id = 1 AND name = 'nekokak' LIMIT 1; 便宜上PRIMARY KE

    #04 single - Articles Advent Calendar 2011 Teng
  • #03 insert / fast_insert - Articles Advent Calendar 2011 Teng

    昨日でTengを利用するのに必要なクラス定義は終了しているので早速 次のステップとして新しいレコードをデータベースに登録する INSERTの方法を紹介します。 insertメソッド SQLのINSERT文を実行するには以下のようにします。 my $row = $teng->insert('user', +{id => 1, name => 'nekokak'}); このようにすると、 INSERT INTO user (id,name) VALUES(1,'nekokak'); というようなSQLが実行され、データベースに新しい行が登録されます。 Tengのinsertメソッドの返り値として、insertしたtableに対応するRowクラスでインスタンス化された Rowオブジェクトがかえってきますので、 $row->id; # 1 $row->name; # nekokak といったように

  • #02 schemaの定義方法 - Articles Advent Calendar 2011 Teng

    Tengを使うにはまずSchemaの定義を行う必要があります。 なお、今回はProj::DBというnamespaceで統一して記述していきます。 コードは特記しない限りSQLiteを前提としています。 以下のようなテーブルがあるとし、 create table user ( id integer, name text, primary key ( id ) ); create table status ( id integer, user_id integer, body text, primary key ( id ) ); コレに対応するTengのSchemaは以下の様に書きます。 package Proj::DB::Schema; use strict; use warnings; use Teng::Schema::Declare; table { name 'user'; pk

    #02 schemaの定義方法 - Articles Advent Calendar 2011 Teng