note.com投稿テスト実装とリポジトリ誤認からの復旧(開発日記 No.050)
関連リンク
はじめに
昨日はOpenRouter APIとの連携を完了し、今日はその流れでnote.comへの投稿機能を実装することに。しかし、今日はちょっとした(いや、かなり大きな)事件が発生しました。その顛末も含めて、今日の開発を振り返ります。
背景と目的
これまで、外部APIとの連携部分を強化してきました。今日はその一環として、実際に記事をnote.comに投稿する機能を実装し、自動投稿の第一歩を踏み出すことを目指します。具体的には、APIクライアントを作成し、記事の下書き作成、取得、削除といった基本的な操作を自動化できるようにします。
検討内容
まずは、note.comのAPIドキュメントを参考に、必要なAPIエンドポイントと認証方法を調査しました。次に、既存のOpenRouter APIクライアントの実装を参考に、同様の構造でnote.comクライアントを設計することにしました。認証情報の管理方法やエラーハンドリングについても、既存の仕組みを再利用することを検討しました。
実装内容
今日は以下の作業を行いました。
-
note.comクライアントの実装 (
note_client.py
):-
NoteClient
クラスを中心に、ログイン、下書き作成、取得、削除などの機能を実装しました。 - APIエラーを適切に処理するための例外クラスも定義しました。
-
-
ユニットテストの実装 (
test_note_client.py
):- モックを使用して、外部APIに依存しないテストを15ケース作成しました。
- 各メソッドの正常系と異常系を網羅的にテストできるようにしました。
-
統合テストの実装 (
test_note_api_posting.py
):- 実際のAPIを使ったテストを行うための基盤を構築しました。
- 環境変数 (
SKIP_NOTE_API_TESTS
) でAPI呼び出しをスキップできるようにし、CI環境でも実行可能にしました。 - テスト後に自動で下書きを削除する機能も実装しました。
-
依存ライブラリの追加:
-
requests
ライブラリをrequirements.txt
に追加しました。
-
# 例:note_client.pyの一部
import requests
class NoteClient:
def __init__(self, email, password):
self.email = email
self.password = password
self.session = requests.Session()
def login(self):
# ログイン処理
pass
def create_draft(self, title, content):
# 下書き作成処理
pass
# ... 他のメソッド ...
技術的なポイント
-
モックの活用: ユニットテストでは、
unittest.mock
を使用してAPIのレスポンスをモックし、外部APIへの依存を排除しました。これにより、テストの実行速度が向上し、APIの可用性に左右されずにテストを実行できるようになりました。 -
環境変数による制御: 統合テストでは、
SKIP_NOTE_API_TESTS
環境変数を使用して、実際のAPI呼び出しをスキップできるようにしました。これにより、CI環境や開発環境など、APIキーが利用できない環境でもテストを実行できるようになりました。 - テスト後のクリーンアップ: 統合テストでは、テストで作成した下書き記事を自動的に削除するようにしました。これにより、テストの実行後にnote.comの画面を手動で整理する必要がなくなり、テストの効率が向上しました。
所感
今日は、note.com API連携の基盤を構築することができました。ユニットテストと統合テストを実装することで、コードの品質を担保しつつ、API連携の動作確認を行うための準備が整いました。
しかし、今日の開発で一番の学びは、リポジトリの確認を怠ると大変なことになる ということです。なんと、私は今日一日、全く別のリポジトリで作業をしていました! テストも通ったし、完璧だ!と思っていたら、全然違う場所でコードを書いていたというオチです。
原因は、複数のプロジェクトを同時に進めている中で、ターミナルのカレントディレクトリを間違えていたこと。本当に情けないミスですが、これもまた良い教訓です。明日は、この誤りを修正し、正しいリポジトリにコードを移植することから始めます。
今後の課題
- 実環境でのテスト実施: 明日は、本番アカウント情報を使って統合テストを実行し、実際の下書き投稿と検証を行います。
- DiaryConverterとの連携: 変換された記事をnote.comに自動投稿する機能を実装し、投稿後のURLを取得してユーザーに通知できるようにします。
- エラーハンドリングの強化: 実際の運用で発生しうる様々なエラーパターンに対応し、リトライ処理を最適化します。
- テスト自動化: CIパイプラインへの統合と、テスト専用アカウントの設定を行います。
まとめ
今日は、note.com API連携の基盤構築と、リポジトリ誤認という大失敗を経験しました。明日は、この失敗を教訓に、正しいリポジトリで開発を進め、note.comへの自動投稿機能の実現に向けて前進します。
Discussion
リポジトリ誤認だけでなく、今日は最初からCursorAgentがこれまでと違う(ダメな)反応を示すことが多かった。。CursorかClaude、どちらかの性能劣化なのかな。。
開発自体がツール機能や外部APIにほぼ100%依存している状態なので、こういうリスクは念頭に置いておかないといけないですね。