インターフェイスでスキーマを定義する
ここまでで、3つのデータモデルをクラスとして定義しました。しかし、これではそれぞれのクラスがどんな情報を扱うのか分からないので、それぞれのクラスに対応するインターフェイスクラスを作ってスキーマを定義しましょう。
Python自身にはインターフェイスという概念はありませんが、Zope 3は拡張モジュールとしてインターフェイスの機能をPythonに持ち込んでいます。データのスキーマ定義にはインターフェイスを用います。
掲示板にはタイトルと概要の2つの情報を保存できるようにしましょう。app.pyは次のようになります。
import grok |
app.py |
IMyForumクラスがインターフェイスです。Zope 3の提供するインターフェイスはクラス定義のシンタックスを利用しています。インターフェイスクラスはzope.interface.Interfaceを継承する必要があり、名前はアルファベットのIから始める規則になっています。
インターフェイスの定義の中でzope.schemaを使ってスキーマの定義をしています。これはRDBMSのCREATE TABLE文のようなもので、データ構造を表しています。
RDBMSと違ってZopeはオブジェクトデータベースを使っているので、実際に保存される情報はあくまで永続クラスのインスタンスであり、それが必ずしもインターフェイスの定義と一致している必要はないのですが、インターフェイスにはコンポーネントのAPIを保証する役割があるので、正しく定義しておきましょう。
IMyForumインターフェイスでtitleとdescriptionの2つのスキーマを定義しました。TextLineスキーマは改行なしのUnicodeテキストデータ、Textスキーマは改行ありのUnicodeテキストデータを表します。
ちなみに、Zope 3の内部ではテキストデータはすべてUnicodeで扱うことになっていますので、スキーマの引数のtitleの値はUnicodeでなければいけません。
MyForumクラスではIMyForumインターフェイスの定義に準じて、2つのアトリビュートを定義し、grok.implementsで該当のインターフェイスを実装したことを宣言しています。
次にスレッドのスキーマを定義しましょう。スレッドにはその題目としてタイトルを保存できるようにします。forumthread.pyは次のようになります。
import grok |
forumthread.py |
最後にコメントのスキーマ定義です。匿名の掲示板でコメントには名前と本文を保存できるようにしました。comment.pyは次のようになります。
import grok |
comment.py |
以上でスキーマの定義は完成です。これでアプリケーションのデータモデルが完成しました。
ユニットテストを書く
さて、データモデルが完成したので、簡単なテストを書いておきましょう。ここでは、appモジュール(app.py)のテストの中で、上で作ったデータモデルを簡単にテストすることにします。
appモジュールをテストするには、app_testsディレクトリを作って、その中にテストコードを置きます。src/myforumディレクトリの中で次のようにコマンドを実行してください。
$ mkdir app_tests |
これで、新しく作ったapp_testsディレクトリの中に空の__init__.pyとtest_app.pyファイルができました。__init__.pyファイルはこのディレクトリをPythonのパッケージ化するのに必要なだけなので、中身は空のままで構いません。test_app.pyには次のテストコードを書いてください。
# -*- coding:utf-8 -*- |
test_app.py |
これは非常に単純なテストで、何もテストしていないようなものですが、引数やシンタックスエラーなどの確認には使えます。このような形でテストコードを追加できるということを覚えておいてください。
次にmyforumパッケージにユニットテストがあることをgrokに登録しましょう。src/myforumの中にtests.pyを作って、以下のように書いてください。
import grok |
tests.py |
これで、myforumパッケージ内の全ユニットテストがgrokに登録されて、testコマンドで実行できるようになります。
src/myforumからMyForumディレクトリに移動して、testコマンドを実行してみましょう。
$ cd ../.. |
上で作ったユニットテストが実行され、無事テストが成功しました。もし、ここでテストに失敗したならば、書き間違いがあると思います。調べて直してください。
![]() |
2/3 |
![]() |
Index | |
掲示板を作ろう(データモデルの定義とユニットテスト) | |
Page1 grokprojectでアプリケーションの開発環境を作る データモデルを考える |
|
![]() |
Page2 インターフェイスでスキーマを定義する ユニットテストを書く |
Page3 buildout.cfgの調整 Subversionにコミットする |
![]() |
Zope 3とは何ぞや? |
Coding Edgeお勧め記事 |
![]() |
いまさらアルゴリズムを学ぶ意味 コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう |
![]() |
Zope 3の魅力に迫る Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? |
![]() |
貧弱環境プログラミングのススメ 柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? |
![]() |
Haskellプログラミングの楽しみ方 のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう |
![]() |
ちょっと変わったLisp入門 Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう |

- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
![]() |
||
|
||
![]() |
Coding Edge 記事ランキング
- 生成AI時代は「Visual Studio Code」一択ではない? 注目の次世代コードエディタとは RedMonk
- 「Rust 1.85.0」公開 「Rust 2024エディション」は安定版に エディションの移行方法は?
- GitHub Copilotで効率的なデバッグを実現する5つの秘策 バグ修正からテスト生成までをどう効率化できるのか
- 書式を覚えて満足してない? Markdownをフル活用するための13テクニック
- .NET AIテンプレートのプレビュー版リリース AIチャットアプリ開発はどう簡単になるのか
- 初心者もベテランも気になる、「検討すべきMarkdownエディタ9選」
- プログラミング言語の人気ランキング、TypeScriptが上昇、C++は下落 RedMonk調べ
- GitHub Copilotを使ってコードをリファクタリングする方法
- Rustの年次調査「State of Rust 2024」が明らかにする、Rustの利用状況と課題
- Excelグラフにタイトル、凡例、データラベルを表示する
- 全てのVisual Studioユーザーが無料版「GitHub Copilot」を利用可能に Visual Studioでの開発体験はどう変わる?
- 初心者もベテランも気になる、「検討すべきMarkdownエディタ9選」
- 生成AI時代は「Visual Studio Code」一択ではない? 注目の次世代コードエディタとは RedMonk
- 書式を覚えて満足してない? Markdownをフル活用するための13テクニック
- プレビュー版が公開された「GitHub Copilot」のエージェントモードは、開発をどこまで自動化するのか?
- GitHub Copilotを使ってコードをリファクタリングする方法
- 「Django」か「Flask」か 成功するプロジェクトのための最適解はどっち?
- 誰も知らない業務プロセスと89部署の調整役 大企業の旭化成がアジャイルで直面した現実とは
- Microsoft、「Visual Studio Code」バージョン1.97公開、GitHub Copilotやログ管理が進化
- 大企業とスタートアップを知る著者が解説 要件定義で「プロジェクトが崩壊する前にやるべきこと」とは