質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

解決済

2回答

5915閲覧

テストコードを実行するとパスはとれいてるのにファイルやディレクトリが見つからない。

sequelanonymous

総合スコア123

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

0クリップ

投稿2018/07/08 12:00

編集2018/07/08 13:01

前提・実現したいこと

python3で書かれたコードを実行すると以下のエラーメッセージはでず正常に動くが、テストコードを実行するとエラーがでる。しかし、print文で変数の中身を確認するとパスは正常に取れているよう見える。

発生している問題・エラーメッセージ

> f = open(sql_path) E FileNotFoundError: [Errno 2] No such file or directory: 'xxx/api/auth/auth.id.sql' ../xxx/common/db/dba.py:28: FileNotFoundError ------------------------------------------------------------------------------------- Captured stdout call -------------------------------------------------------------------------------------- a1<module 'xxx.common.db.dba' from '/Users/xxx/local/xxx/xxx/common/db/dba.py'> a1xxx/api/auth/auth.id.sql ============================================================================== 1 failed, 1 passed in 4.94 seconds ===============================================================================

該当のソースコード(dba.py)

python

1sql_path = 'xxx/api/auth/auth.id.sql', sql_params = {xxx} 2 3 def daccess(sql_path, **sql_params): 4 print('a1'+str(sql_path)) 5 f = open(sql_path)

該当のテストコード(pytest)

from dba import daccess ... ... def test(): sql_path = "xxx/api/auth/auth.id.sql" id_ = 'xxx' print('a1' + str(sql_path)) rows = dba.daccess(sql_path, s1=id_)

色々調査して試してみた結果、疑っていること

pythonコードそのものはちゃんと動くのでpytestで書かれたテストコードのフォルダのディレクトリがpythonコードが実行されるトップディレクトリ(mange.py)ではないため、エラーがでているのかなと推測しています。どのようにpythonコードが実行されるのと同じようにpytestも同じディレクトリで実行できるのかなーと困っています。恐らく、テストコードでとれるsql_pathは、.. /xxx/api/auth/auth.id.sqlという形になるのが正しいでのはと疑っています。この点どう思いますでしょうか?

###追記
ファイルそのものを移動してディレクトリを変更したが、以下のcontextsなるものを追記する必要がありこの以下のURLだけでは使い方と意味がわからないので困っています。
http://flask-sqlalchemy.pocoo.org/2.3/contexts/

self = <SQLAlchemy engine=None>, reference_app = None def get_app(self, reference_app=None): """Helper method that implements the logic to look up an application.""" if reference_app is not None: return reference_app if current_app: return current_app._get_current_object() if self.app is not None: return self.app raise RuntimeError( > 'No application found. Either work inside a view function or push' ' an application context. See' ' http://flask-sqlalchemy.pocoo.org/contexts/.' ) E RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/. ../../../.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py:912: RuntimeError

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Testing Flask ApplicationsのThe Testing Skeleton

投稿2018/07/08 18:56

umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

os.chdir()でカレントディレクトリを動かせるので、プログラム本体があるディレクトリに移せばよいかと。

参考:
Pythonでカレントディレクトリを取得、変更(移動) | note.nkmk.me

投稿2018/07/08 12:04

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2018/07/08 12:45

ご回答ありがとうございます。上記の方法を使わずともディレクトリを移動して試したり、直接パスを変更して指定したりしていました。しかし、そうすると以下のエラーが発生します。 ``` self = <SQLAlchemy engine=None>, reference_app = None def get_app(self, reference_app=None): """Helper method that implements the logic to look up an application.""" if reference_app is not None: return reference_app if current_app: return current_app._get_current_object() if self.app is not None: return self.app raise RuntimeError( > 'No application found. Either work inside a view function or push' ' an application context. See' ' http://flask-sqlalchemy.pocoo.org/contexts/.' ) E RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/. ../../../.pyenv/versions/3.6.5/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py:912: RuntimeError ``` このエラーの意味そのものが理解不明ですが、テストコードに何か記載不足があるようです。何かぱっと思いつく解決策ありましたらご教示頂けますと助かります。
hayataka2049

2018/07/08 12:56

テスト対象の方でapplicationの中身と噛んじゃってて、contextなるものを要求されているのでは? 私はFlaskとかSQLAlchemyに詳しくないので、あまり助言できません。質問文に追記しておくと他の方から回答がいただけるかもしれません。その際は追加の情報が必要だと思います(可能なら関連するコードとエラーの全文)
sequelanonymous

2018/07/08 16:22

ご回答ありがとうございます。追加してみました。ちなみに、テスト対象の方でapplicationの中身と噛んじゃって...というのはどういう意味でしょうか?色々試してみましたが、中々解決に至りません。
hayataka2049

2018/07/08 16:37

テスト対象がアプリケーションそのものに依存してて、単体ではうまく動作しない、アプリケーションが走っていないとテストできないようなコードになっている
sequelanonymous

2018/07/08 16:57

すみません、私はプログラミング歴が浅くど素人なのでもう少し咀嚼して頂けませんでしょうか?特に、アプリケーションそのものに依存してて、単体ではうまく動作しない、アプリケーションが走っていないとテストできないようなコードっていうのは、どういうコードのことでしょうか?単体ではうまく動作していると思っていました。意味が気になりますので再度教えて頂けると嬉しいです。
hayataka2049

2018/07/08 17:16 編集

アプリケーションとして立ち上げてやると必要な変数等がそっちで用意されるけど、単体テストだとそこをすっ飛ばしていきなり関数のテストを始めてしまっているから駄目なのでしょう、ということです。
sequelanonymous

2018/07/08 17:26

理解しました。ありがとうございます!その辺は、依存しないように変数などを直書きで細かく書いています。(当質問には記載していませんが)。いまのお返事でふと気づいたのが以下のあたりが怪しい気はしています。何かお気づきな点ありましたらご教示願います。上記の同じpytestコードに記載されている部分になります。 ``` app = Flask(__name__) app.config.from_object(test) dba.init_app(app) logger = logging.getLogger(__name__) init_app(app, dba, logger) ```
hayataka2049

2018/07/08 17:30 編集

投稿ミス。削除済み
hayataka2049

2018/07/08 17:30

断片的な情報から答えを出すのは難しいのと、コメントに書いても他の方には追いづらいので、質問文に公開できる限りの関連する部分のコードとエラーメッセージの全文(今の載せ方ではどこから出てきたエラーなのかすらわかりません。おそらくstacktraceが長々と出てると思いますが、そっちの情報が大切です)を書いてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問