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

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

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

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

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2371閲覧

Flask公式チュートリアルの「pytest」でAssertionErrorが起こる

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/29 04:05

編集2021/11/29 05:33

前提・実現したいこと

Flask公式チュートリアルを終えて、「pytest(最初のテスト)」をするところで発生するエラーによってテストが実施できていません。
エラーが出たためチュートリアルからソースコードをすべてコピペしなおしました。

【使用しているバージョン】
Windws
Python 3.9.9
Flask 2.0.2
pytest 6.2.5

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

cmd

1$pytest #pytest実行 2~~~~~~~~~~~~~~ 3 @pytest.fixture 4 def client(): 5> db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp() 6E NameError: name 'flaskr' is not defined 7 8tests\test_flaskr.py:10: NameError 9============================= short test summary info ============================= 10ERROR tests/test_flaskr.py::test_empty_db - NameError: name 'flaskr' is not defined

該当のソースコード

test_flaskr.py

python

11 import os 22 import tempfile 33 44 import pytest 55 from flaskr import create_app 66 77 88 @pytest.fixture0 99 def client(): 1010 db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp() 1111 flaskr.app.config['TESTING'] = True 1212 1313 with flaskr.app.test_client() as client: 1414 with flaskr.app.app_context(): 1515 flaskr.init_db() 1616 yield client 1717 1818 os.close(db_fd) 1919 os.unlink(flaskr.app.config['DATABASE']) 2020 2121 def test_empty_db(client): 2222 """Start with a blank database.""" 2323 2424 rv = client.get('/') 2525 assert b'No entries here so far' in rv.data

5行目のfrom flaskr import create_appという記述がうまく動いていないのではと思っています。
(create_appが薄い文字で表示されています)

試したこと

flaskrが定義されていないとエラーが出ているので、 
a = create_app()
この記述を追加して実行してみるとAssertionErrorが発生してしまいます。

test_flaskr.py

python

1import os 2import tempfile 3 4import pytest 5 6from flaskr import create_app 7from flaskr.db import init_db 8 9a = create_app() 10 11@pytest.fixture 12def client(): 13 db_fd, a.config['DATABASE'] = tempfile.mkstemp() 14 a.config['TESTING'] = True 15 16 with a.test_client() as client: 17 with a.app_context(): 18 init_db() 19 yield client 20 21 os.close(db_fd) 22 os.unlink(a.config['DATABASE']) 23 24def test_empty_db(client): 25 """Start with a blank database.""" 26 27 rv = client.get('/') 28 assert b'No entries here so far' in rv.data

cmd

1$pytest #pytest実行 2~~~~~~~~~~~~~~ 3client = <FlaskClient <Flask 'flaskr'>> 4 5 def test_empty_db(client): 6 """Start with a blank database.""" 7 8 rv = client.get('/') 9> assert b'No entries here so far' in rv.data 10E assert b'No entries here so far' in b'<!doctype html>\n<title>Posts - Flaskr</title>\n<link rel="stylesheet" href="/static/style.css">\n<nav>\n <h1>Flask...l>\n</nav>\n<section class="content">\n <header>\n \n <h1>Posts</h1>\n \n\n </header>\n \n \n \n\n</section>' 11E + where b'<!doctype html>\n<title>Posts - Flaskr</title>\n<link rel="stylesheet" href="/static/style.css">\n<nav>\n <h1>Flask...l>\n</nav>\n<section class="content">\n <header>\n \n <h1>Posts</h1>\n \n\n </header>\n \n \n \n\n</section>' = <WrapperTestResponse 337 bytes [200 OK]>.data 12 13tests\test_flaskr.py:28: AssertionError 14============================================================= short test summary info ============================================================== 15FAILED tests/test_flaskr.py::test_empty_db - assert b'No entries here so far' in b'<!doctype html>\n<title>Posts - Flaskr</title>\n<link rel="styl...

長々しく書いてしまい申し訳ありません。
a = create_app()
この記述を書いたことでテスト対象まで処理が進んだように見えます。
AssertionErrorということは公式チュートリアルの記述自体が間違っているのでしょうか?

補足情報

python・Flask初学者で分からないところも多くありますが調べながら探り探り学習を進めております。
足りないソース等がありましたらご指摘ください。
ご教示お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

公式に問題がありそうです。とりあえずテストの部分は以下を見ながらやった方が良さそうです。
https://github.com/pallets/flask/pull/3606

とりあえずtest_flaskr.pyに以下を追記すればいいのかなと思いました。

python

1import flaskr

もしくはFlask==1.1.2 0.12.4にダウングレードすればうまくいくかもです

投稿2021/11/29 05:49

編集2021/11/29 06:47
holy_

総合スコア364

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

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

退会済みユーザー

退会済みユーザー

2021/11/29 06:29 編集

ご回答いただきありがとうございます。 公式に問題があった場合チュートリアルのコード自体を直さないといけないとなると初学者には難しいですかね、、、 ご指摘いただいたとおりimport flaskrを追記すると AttributeError: module 'flaskr' has no attribute 'app' とエラーが出てしまいました。 Flask==1.1.2にダウングレードしたところ、同じくNameErrorが出てしまいました。
holy_

2021/11/29 06:35

今記載しているテストコードすべて公式から消えそうな感じなのでそれを直すとなると難しいかもです。 私でしたら今ののコード直すよりは以下のリポジトリをクローンしてテスト実行して自分で確認する方が良いかなと思います。 https://github.com/pallets/flask/tree/2.0.1/examples/tutorial 一応ドキュメントは以下で更新されそう? https://github.com/isdanni/flask/blob/test-docs-update/docs/testing.rst エラーに関してはもう少しらべてみます
holy_

2021/11/29 06:44

Flask==0.12.4ではどうでしょう?
退会済みユーザー

退会済みユーザー

2021/11/29 07:40 編集

分かりやすく丁寧に教えていただきありがとうございます。 諸事情でGitHubが使えずクローンができないので、教えていただいた https://github.com/pallets/flask/tree/2.0.1/examples/tutorial このチュートリアルを手動でコピーをしてみました。 その中にtest_flaskr.pyの記述がなかったのでテストの部分はGitHubにあった https://flask.palletsprojects.com/en/2.0.x/testing/ ここの記述をコピペしてみたところ、a = create...ように自分で記述を足さなくても AssertionErrorになりました。 Flask==0.12.4では先ほどと同じくNameErrorが出てしまいました。
holy_

2021/11/29 07:46

色々勘違いしてました。テスト自体は正常に動かせてはいるのかなと思いました。 assertでエラーが起きないようにするように実装を修正するのが本来の形かなと思います。 実装の方でDBにデータがない場合「No entries here so far」と表示されるの期待しているのに表示されてないのでAssertionErrorエラーでテストが失敗しているもしかしらテストではなく実装の方を修正が必要かと思います。 まあチュートリアルが古いのでなんとも言えませんが
退会済みユーザー

退会済みユーザー

2021/11/29 08:03

最後まで丁寧にご回答いただきありがとうございました。 pytestは別途教材を用意して学習をしたいと思います。 課題解決までの考え方等とても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問