タグ

ブックマーク / shuji-w6e.hatenadiary.org (14)

  • テストのプロセス - やさしいデスマーチ

    というわけで、「はじめて学ぶ ソフトウェアのテスト技法」を読み直しているので、メモ*1。 テストとは? IEEE 標準規格 610.12-1990による定義。 ある特定の条件下でシステムまたはコンポーネントを操作するプロセスであり、その結果を観察または記録して、システムまたはコンポーネントのある側面を評価すること テストの成熟度 テストに関して以下の5つの成熟度(レベル)がある レベル0ーテストはデバッグと同等 レベル1ーテストとはシステムが動くことの確認 レベル2ーテストとはシステムが動かないことの確認 レベル3ーテストとはシステムのリスクを減らすこと レベル4ーテストとはシステムの品質を高める為の規範 テストケース テストの実装。テストケースは、適当に作るのではなく、正しく「設計」することが必要。 入力 出力 実行の手順 すべて曖昧であってはテストケースとして不完全。 テストの分類 ブ

    テストのプロセス - やさしいデスマーチ
  • コンストラクタ内でのthis参照リーク問題 - やさしいデスマーチ

    GUIの設計パターン」のコメントで指摘があったので補足しておきます。 Javaのコンストラクタは思った以上に複雑で、希に困った状況を引き起こします。その1つの例が「コンストラクタ内でthis参照リーク」問題です。次のようなコードがあった時、どうなるか予想できるでしょうか? class Bar { Foo foo = null; Bar() { } } public class Foo { Bar bar = null; final String finalObj; Foo(Bar bar) { bar.foo = this; if (true) throw new RuntimeException(); this.finalObj = "OK"; } public static void main(String[] args) { Bar bar = new Bar(); try { F

    コンストラクタ内でのthis参照リーク問題 - やさしいデスマーチ
    voidy21
    voidy21 2011/03/21
  • 90-コードを見る人のためにテストを書く - やさしいデスマーチ

    「プログラマが知るべき97のこと」の90個目のエピソードは、テストに関する話です。きのこには当に多くのテストに関するエピソードがあります。テストの書き方、目的、心構えなど様々なテストに関する重要なトピックがありますが、このエピソードでは「誰のためのテストか?」という点について書かれています。56ー未来へのメッセージなどでも書かれていますが、プログラムを現在の自分の自己満足にしてはなりません。テストも同様であり、自分の為や製品の品質の為ではなく「コードを見る人のため」にテストを書く事が良いテストの条件です。 ・コンテキスト、出発点、満たすべき事前条件がわかる。 ・ソフトウェアがどのように起動されるかがわかる。 ・期待される結果と、確認すべき事後条件がわかる。 これらの条件を満たすテストは、良いテストです。一見、当たり前のようにも思えますが、他人がテストコードを読んだとき、これらの事が明確

    90-コードを見る人のためにテストを書く - やさしいデスマーチ
    voidy21
    voidy21 2011/03/21
  • 単純な処理の単体テストが重要 - やさしいデスマーチ

    先日、appengine SDKが1.3.8にアップデートしたのですが、ローカル環境のSDKを1.3.8にした所、EtupirkaCMSの単体テストが1/3くらい失敗するようになりました。 原因の1つはプロトコルバッファを使って画像加工の部分を単体テスト用に細工しているところで、APIの仕様が変わった事。これはgoogleAPIを使っている以上は仕方ないです。ですが、もう1つの(ほとんどの)原因はカウント系の挙動がオカシイことです(テスト環境のみだと思われます)。 具体的には slim3 1.0.5の場合、 Kindを指定したcount countQuickly の2つが常にゼロを返すのです。 appengine-testing.jarとappengine-stub.jarが最新版でなかったのが原因でした。他のSDKのライブラリはPluginで指定できますが、これらのテスト用のjarは

    単純な処理の単体テストが重要 - やさしいデスマーチ
  • 単体テスト勉強会 - やさしいデスマーチ

    札幌Javaコミュニティの勉強会の最近のテーマは主に3つ。 言語の基礎 単体テスト GAE 今回は単体テストの基礎ということで、どのように単体テストをすれば効果的か?という点をテーマにやりました。資料はこちら。 Unit testView more presentations from Shuji Watanabe. 当日に書いたコードはこちら。ただし、これは正解ではないです。あくまで1つの例でしかないのでご注意ください。 Bitbucket ワークショップスタイルで、実際に考えて手を動かしてディスカッションしながらだったので、あまりブログでまとめるのが難しい所です。 追記 これだけスライドから転記。 assertThat(${actual}, is(${expected})); ${assert:importStatic ('org.junit.Assert.*')} ${matcher

    単体テスト勉強会 - やさしいデスマーチ
  • メソッドの型パラメータを指定する時によく忘れること - やさしいデスマーチ

    thisをよく忘れるのでメモ。 private <T> T foo() { // なんか処理 return (T) obj; } 変数に代入するような場合は、型推論が効くので簡単。 String str = foo(); Date date = foo(); これをメソッドでつなげたりするとウマく推論できなくなる。 // コンパイルエラー // fooの戻り値はObject型になる(型TがObject型) long time = foo().getTime(); で、こんな場合は2回に分けると解決 Date date = foo(); long time = date.getTime(); ・・・1行で書きたいよね。 というわけで、1行で書きたい場合は、fooに型パラメータを明示する。 指定方法はメソッドの前に<型>を指定すれば良いんだけど、次のような書式はダメ。 long time =

    メソッドの型パラメータを指定する時によく忘れること - やさしいデスマーチ
    voidy21
    voidy21 2010/03/21
  • Java開発者の読むDjangoの設計思想 - やさしいデスマーチ

    Djangoのサイトには「Djangoの設計思想」というドキュメントがあります。どんなフレームワークでもそうですが、設計思想を理解し、その流れをつかむ事で正しい利用への最短ルートです。もし、自分の思想にあわないならば問題です。可能であれば、そのフレームワークの検討を取り止めるべきでしょう。それが出来ないならば利用している時にはそのフレームワークの思想で思考することが求められます。 Djangoの設計思想は、緩く結合し、必要最低限のコードで、だが隠蔽せずに明示するという事です。DjangoではMVT(モデル/ビュー/テンプレート)と呼ばれるMVCに近い構造をとります。それらの3つのレイヤーはお互いに疎な関係を持ち、モデルとテンプレートはデフォルトの実装以外を容易に採用できるようになっています。また、ほどよく規約を適用し必要なコード量は少なくなっていまが、なんでもかんでも裏側で処理せずに、なに

    Java開発者の読むDjangoの設計思想 - やさしいデスマーチ
  • JavaFX のシーケンスはキモいのか? - やさしいデスマーチ

    JavaFXでは配列やリストに相当するデータ型としてシーケンスがあります。一見、LLのリストのように配列オブジェクトで追加や削除などのメソッドが定義されているように思えますが、実態はJavaの配列に近く、記述方法がJSONっぽく書けるだけです。また、追加/削除などの操作はできず、insert文を使うことで新しいシーケンスを生成するような仕組みになっています。特にシーケンスへ要素を追加する場合、insert文を使うなど、かなり意味が解らない所です。 可変長配列も後ろに追加するのにこんな感じ。 var a = []; insert "a" into a; insert "b" into a; println(a); え゛! なにこれ。COBOLをやりたいの?わけわかんねー。 http://d.hatena.ne.jp/shin/20090803/p1 JavaFX Scriptではシーケンスに

    JavaFX のシーケンスはキモいのか? - やさしいデスマーチ
  • PythonでTDD入門(4) - インスタンス変数のプライベート化 - やさしいデスマーチ

    これまでのサイクルでDollarをバリューオブジェクトとして扱うようになりました。また、Dollarオブジェクトの同値関係が定義され、最初のテストも奇麗に書き換える事ができます。 def test_multiplication(self): five = Dollar(5) product = five.times(2) self.assertEqual(Dollar(10), product) product = five.times(3) self.assertEqual(Dollar(15), product) さらに変数のインライン化を行います。 def test_multiplication(self): five = Dollar(5) self.assertEqual(Dollar(10), five.times(2)) self.assertEqual(Dollar(15)

    PythonでTDD入門(4) - インスタンス変数のプライベート化 - やさしいデスマーチ
  • PythonでTDD入門(3) - バリューオブジェクトと等価性 - やさしいデスマーチ

    前回はオブジェクトに副作用があるという設計上の問題を解決する為に、timesメソッドの戻り値をDollarに修正しました。この変更はバリューオブジェクトパターンを適用したと考える事ができます。 バリューオブジェクトとはその名前が表すようにオブジェクトが値そのものを表現するパターンです。つまり、Dollar(10)とDollar(10)は等価であり、Dollar(10)とDollar(15)は等価でない事が必要になります。まずはこの事を確認する為のテストを書きましょう。 def test_eq(self): """ 等価性に関するテスト """ self.assertEqual(Dollar(5), Dollar(5)) self.assertEqual(Dollar(6), Dollar(6)) 当たり前のよう成功すると思えますが、テストは失敗します。 1) Failure: test_e

    PythonでTDD入門(3) - バリューオブジェクトと等価性 - やさしいデスマーチ
  • ウィンドウを描いてみた - やさしいデスマーチ

    現在のJavaFXではアラートなどサブウィンドウの表示はあまり見栄えの良いものがありませんので作ってみました。 動作サンプルとソースコードです。 JavaFXで用意されているメソッド JavaFX1.2.1では簡単な確認ダイアログやアラートダイアログを表示する関数が用意されています。 import javafx.stage.Alert; Alert.inform("情報", "お知らせです"); Alert.confirm("確認", "保存します。"); Alert.question("確認", "よろしいですか?"); confirmでは「了解」「取消」、questionでは「はい」「いいえ」タイプの確認ダイアログが表示されますが、これはプラットフォームに依存するシステムダイアログです。プラットフォームに依存しないようなスクリプトを書けるのがJavaFXの特徴ではありますが、ディスクト

    ウィンドウを描いてみた - やさしいデスマーチ
  • 伸縮可能なボックス - やさしいデスマーチ

    JavaFX面白いのに反応がほとんどないのが悲しい今日この頃。 さて、こんな感じのGUIで、ボックスの端をマウスでドラッグすることで値を変化させたい、ありがちなコントロールかと思います。 JavaFXで作ってみました。動くサンプルはこちらから。 結構、手の込んだ事をしないと実装できなそうな気がしますが、JavaFXだと80行程度で実現できます。 ソース解説 public class ResizableBox extends CustomNode { // 中略 } 基的にカスタムコンポーネント(Node)を作成するにはCustomNode のサブクラスを作成し、createメソッドでカスタムコンポーネントを返します。 override function create():Node { return Group { content: [ Rectangle { // Right x: bi

    伸縮可能なボックス - やさしいデスマーチ
  • Pythonの開発環境をvimに整える - やさしいデスマーチ

    vimPythonの開発環境を作ってみました。 自動インデント コード補完 スクリプトの実行 インデントの設定 自動 インデントはPythonでコーディングをする場合には必須な機能です。定番の設定があるので、.vimrcに追記します。 filetype plugin on autocmd FileType python setl autoindent autocmd FileType python setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class autocmd FileType python setl expandtab tabstop=4 shiftwidth=4 softtabstop=4インデントは4文字でタブ文字ではなく半角スペースで設定するようにしています。また、if等の

    Pythonの開発環境をvimに整える - やさしいデスマーチ
  • Androidでゲーム作成(1) - やさしいデスマーチ

    Androidを使ってゲームでも作りたいな、という事でAPIとか調べならが試してみました。AndroidではSwingは使えないのですが、比較的に似たインターフェイスのAPIが用意されているため、Swingで簡単なゲームを作ったことがあればすぐになれるのではないでしょうか。 とりあえず、AndroidでHelloWorldくらいは作れる能力がある前提です。まったく試したことない人は、日Androidの会のチュートリアルがオススメです。 自由に描画できるCanvasが欲しい - SurfaceView ゲームでは、テキストエリアなどのGUIのコンポーネントを配置していくのではなく、背景やキャラクターなどを独自に描画しなければなりません。Swingであれば、paintComponentをオーバーライドして…となるわけですが、Androidの場合はSurfaceViewという専用のViewを使

    Androidでゲーム作成(1) - やさしいデスマーチ
  • 1