ckanのプラグインの開発時、バックエンドのテスト実行時にエラーになった個所について記載します。
環境
Windows上でDockerのコンテナ上にckanを構築しています。
ソフトウェアなど | バージョン |
---|---|
Windows | 10 |
Docker | v20.10.7 |
Docker Compose | v2.0.0-beta.4 |
Debian GNU/Linux | v9 |
python | v2.7.13 |
pytest | v4.6.5 |
ckan | v2.9.3 |
PostgreSQL | v11.2 |
Solr | v6.6.5 |
Redis | v6.2.4 |
発生したエラー
設定ファイル(who.ini)読み込み時にエラーになる
エラー内容
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR> File "/usr/lib/ckan/venv/local/lib/python2.7/site-packages/_pytest/main.py", line 204, in wrap_session
...(略)...
INTERNALERROR> MissingSectionHeaderError: File contains no section headers.
INTERNALERROR> file: /usr/lib/ckan/venv/src/ckan/who.ini, line: 1
INTERNALERROR> 'ckan/config/who.ini'
原因
Linuxのシムリンクのwho.ini
がWindows上でサポートされないためです。
解決方法
シムリンク先のwho.ini
を直接参照するようにテスト用設定ファイルを修正します。
who.config_file = {who.iniのリンク先}
※who.ini
のリンク先の確認方法
ckanのGitHub上から確認し、リンク先のパスを探してください。
参考
DBの操作を行う実装個所でエラーになる
テスト用DBのクリーンを行うために以下のようなテストコードを実装しました。
@pytest.mark.usefixtures('clean_db')
def test_plugin():
pass
エラー内容
self = <sqlalchemy.dialects.postgresql.psycopg2.PGDialect_psycopg2 object at 0x7f3e6e7cb7d0>, cursor = <cursor object at 0x7f3e6e7bac50; closed: -1>, statement = '\nDROP TABLE spatial_ref_sys', parameters = {} rs = {}
context = <sqlalchemy.dialects.postgresql.psycopg2.PGExecutionContext_psycopg2 object at 0x7f3e6af4bdd0>
def do_execute(self, cursor, statement, parameters, context=None):
> cursor.execute(statement, parameters)
E InternalError: (psycopg2.errors.DependentObjectsStillExist) cannot drop table spatial_ref_sys because extension postgis requires it
E HINT: You can drop extension postgis instead.
E
E [SQL:
E DROP TABLE spatial_ref_sys]
E (Background on this error at: http://sqlalche.me/e/2j85)
../../local/lib/python2.7/site-packages/sqlalchemy/engine/default.py:550: InternalError
原因
テスト用DBが初期化されていない可能性があります(参照しているDB情報が異なる)。
解決方法
ckanをホストするサーバーのシェルスクリプトで以下を実行します。
CKAN_SQLALCHEMY_URL={テスト用DBの接続情報}
# 例としてプラグイン「sample」のテストを行う
cd /usr/lib/ckan/venv/src/ckanext-sample
# テスト実行
pytest --ckan-ini={テスト用の設定ファイル} ckanext/sample/tests
解説
大切な個所は以下1点です。PostgresSQLの拡張機能「Postgis」は関係ありません。
-
CKAN_SQLALCHEMY_URL={テスト用DBの接続情報}
環境変数「CKAN_SQLALCHEMY_URL」を使用していなければ、設定ファイル内のDB情報が正しく参照されるためエラーは発生しません。もし環境変数「CKAN_SQLALCHEMY_URL」にすでに本番用DBの接続情報が設定されている場合、テスト用の設定ファイルに
sqlalchemy.url
を指定していても環境変数側の値が優先されます。