Python
Facebook
test
CI
GraphAPI

Facebookのテストユーザーを利用してFacebookアプリのテストを自動化する

More than 1 year has passed since last update.

こんにちはsekitakaです。

Facebookアプリを開発しているとGraph APIを使って投稿する関数のテストなどを実装する必要が出てきます。
はじめは自分のアカウントでテストしたりしましたが、自動化するとなると別の方法を検討する必要がありました。

調べたところFacebookには開発用のテストユーザーを作成する機能があります。
この機能はGUIとAPIの両方で提供されており、テストユーザーの作成と削除ができます。
これを利用してテストの度にFacebookのテストユーザーを生成しテストを実行する事で、テストの自動化に対応することができます。

GraphAPIのテスト自動化のフロー

  1. テスト開始時にFacebookのテストユーザーを作成する
  2. 単体テストする
  3. Facebookのテストユーザーを削除する

サンプル

pythonでのテストケースのサンプルは以下のようになります。

sample.py
# coding:utf-8
# !/usr/bin/python
import facebook
import unittest
from unittest import TestCase


# テスト対象関数
# ただメッセージをウォールに投稿するだけ
def post(message, fb_token):
    graph = facebook.GraphAPI(fb_token)
    graph.put_wall_post(message)


class Test(TestCase):
    # Facebookテストユーザー
    FB_USER = None

    FB_APP_ID = 'YOUR_APP_ID'
    FB_APP_SECRET = 'YOUR_APP_SECRET'

    @classmethod
    def setUpClass(cls):
        super(Test, cls).setUpClass()

        # テストユーザーを作成
        app_token = facebook.GraphAPI().get_app_access_token(cls.FB_APP_ID,
                                                             cls.FB_APP_SECRET,
                                                             True)
        graph = facebook.GraphAPI(app_token)
        cls.FB_USER = graph.request(cls.FB_APP_ID + '/accounts/test-users', {
            'permissions': 'public_profile,user_photos,publish_actions'
        }, {},
                                    method='POST')

    @classmethod
    def tearDownClass(cls):
        super(Test, cls).tearDownClass()

        # テストユーザーを削除
        app_token = facebook.GraphAPI().get_app_access_token(cls.FB_APP_ID,
                                                             cls.FB_APP_SECRET,
                                                             True)
        graph = facebook.GraphAPI(app_token)
        graph.request(cls.FB_USER['id'], {}, None, method='DELETE')

    # postが正常に投稿できることをテスト
    def test_post(self):
        print Test.FB_USER
        post("hogehoge", Test.FB_USER['access_token'])


if __name__ == '__main__':
    unittest.main()

まとめ

今回はpythonのサンプルコードをのせましたが、GraphAPIはHTTPベースなので言語を問わず同様の仕組みを作れると思います。
いつの間にかAPIの仕様が変わるといったことも考えられるので、GraphAPIを利用する関数のCIで定期的なテストを実施しておくとよいですね。