运行测试用例test_app.py,怎么跑到todoism去了呢?且并没有生成测试用户和条目。
(FlaskProjects-BArbVR56) D:\FlaskProjects\FlaskHTTP\mytodoism>set FLASK_APP=test_app.py
(FlaskProjects-BArbVR56) D:\FlaskProjects\FlaskHTTP\mytodoism>flask run
* Serving Flask app "test_app.py" (lazy loading)
* Environment: development
* Debug mode: on
* Restarting with windowsapi reloader
* Debugger is active!
* Debugger PIN: 932-847-626
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
test_app.py
from mytodoism import create_app, db
from mytodoism.models import User, Item
app = create_app('testing')
with app.app_context():
db.create_all()
user = User(username='grey')
user.set_password('123')
db.session.add(user)
item1 = Item(body='test item 1')
item2 = Item(body='test item 2')
item3 = Item(body='test item 3')
item4 = Item(body='test item 4', done=True)
user.items = [item1, item2, item3, item4]
db.session.commit()
这句与以下这句效果一样吗?
db.session.add_all([item1, item2, item3, item4])
session.commit()
前还要加一句session.add(user)
flask run
是项目启动,要执行测试请用python执行。仔细看书。
python test_app.py
谢谢!李老师书本也少了这句,得加上。
可我运行pyhton test_app.py,数据库并没有增加用户和条目,运行test_ui.py,都好像直接跳出了,什么原因?
(FlaskProjects-BArbVR56) D:\FlaskProjects\FlaskHTTP\mytodoism>python test_app.py
(FlaskProjects-BArbVR56) D:\FlaskProjects\FlaskHTTP\mytodoism>cd tests
(FlaskProjects-BArbVR56) D:\FlaskProjects\FlaskHTTP\mytodoism\tests>python test_ui.py
(FlaskProjects-BArbVR56) D:\FlaskProjects\FlaskHTTP\mytodoism\tests>
你执行测试app的时候,使用的是testing
配置
app = create_app('testing')
我不知道你运行flask run
是什么配置,默认的development
开发配置?两个配置不一样,数据库对应的路径可能也不一样,所以你再启动服务器是看不到数据库新增的数据的。
todoism配置源码:https://github.com/greyli/todoism/blob/master/todoism/settings.py
注意下面的SQLALCHEMY_DATABASE_URI
配置。
class BaseConfig:
TODOISM_LOCALES = ['en_US', 'zh_Hans_CN']
TODOISM_ITEM_PER_PAGE = 20
BABEL_DEFAULT_LOCALE = TODOISM_LOCALES[0]
# SERVER_NAME = 'todoism.dev:5000' # enable subdomain support
SECRET_KEY = os.getenv('SECRET_KEY', 'a secret string')
###############################################################
# 注意这里
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL', 'sqlite:///' + os.path.join(basedir, 'data.db'))
###############################################################
SQLALCHEMY_TRACK_MODIFICATIONS = False
class DevelopmentConfig(BaseConfig):
pass
class ProductionConfig(BaseConfig):
pass
class TestingConfig(BaseConfig):
TESTING = True
###############################################################
SQLALCHEMY_DATABASE_URI = 'sqlite:///' # 注意这里
###############################################################
WTF_CSRF_ENABLED = False
config = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'testing': TestingConfig
}
谢谢,数据库明白了,但为什么执行python test_ui.py就直接跳出了呢?
tests文件夹里的代码不能直接用python执行的。
运行所有测试应该这么运行
python -m unittest discover -v
单独运行某个测试的话,具体看书本【12.3.4 运行测试】
用这个命令也一样,好像没测试!
D:\FlaskProjects\FlaskHTTP\mytodoism 的目录
2019/04/13 11:42 <DIR> .
2019/04/13 11:42 <DIR> ..
2019/04/07 20:58 61 .flake8
2019/03/20 01:50 44 .flaskenv
2019/04/01 07:21 66 .gitattributes
2019/04/13 15:21 <DIR> .idea
2019/03/03 23:16 49 babel.cfg
2019/04/12 22:04 49,152 data.db
2019/04/07 21:15 <DIR> mytodoism
2019/04/01 07:21 12 README.md
2019/04/13 15:21 <DIR> tests
2019/04/13 11:42 513 test_app.py
7 个文件 49,897 字节
5 个目录 488,852,668,416 可用字节
(FlaskProjects-BArbVR56) D:\FlaskProjects\FlaskHTTP\mytodoism>python -m unittest discover -v
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
的确是没有,如果这是你自己的工程,你可能要对比下原工程。
todoism工程我执行测试打印如下:
> python -m unittest discover -v
test_404_response (tests.test_api.APITestCase) ... ok
test_405_response (tests.test_api.APITestCase) ... ok
test_api_index (tests.test_api.APITestCase) ... ok
test_clear_items (tests.test_api.APITestCase) ... ok
test_delete_item (tests.test_api.APITestCase) ... ok
test_edit_item (tests.test_api.APITestCase) ... ok
test_get_item (tests.test_api.APITestCase) ... ok
test_get_items (tests.test_api.APITestCase) ... ok
test_get_token (tests.test_api.APITestCase) ... ok
test_get_user (tests.test_api.APITestCase) ... ok
test_new_item (tests.test_api.APITestCase) ... ok
test_toggle_item (tests.test_api.APITestCase) ... ok
test_fail_login (tests.test_auth.AuthTestCase) ... ok
test_login (tests.test_auth.AuthTestCase) ... ok
test_logout (tests.test_auth.AuthTestCase) ... ok
test_view_protect (tests.test_auth.AuthTestCase) ... ok
test_app_exists (tests.test_basic.BasicTestCase) ... ok
test_app_is_testing (tests.test_basic.BasicTestCase) ... ok
test_change_language (tests.test_home.HomeTestCase) ... FAIL
test_index (tests.test_home.HomeTestCase) ... ok
test_intro (tests.test_home.HomeTestCase) ... ok
test_app_page (tests.test_todo.ToDoTestCase) ... ok
test_clear_item (tests.test_todo.ToDoTestCase) ... ok
test_delete_item (tests.test_todo.ToDoTestCase) ... ok
test_edit_item (tests.test_todo.ToDoTestCase) ... ok
test_new_item (tests.test_todo.ToDoTestCase) ... ok
test_toggle_item (tests.test_todo.ToDoTestCase) ... ok
test_change_language (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_clear_item (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_delete_item (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_edit_item (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_get_test_account (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_index (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_login (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_new_item (tests.test_ui.UserInterfaceTestCase) ... ERROR
test_toggle_item (tests.test_ui.UserInterfaceTestCase) ... ERROR
原因找到了,这tests目录必须是子包形式,也就是必须要有__init__.py空文件,否则不会寻找!
1 个赞
greyli
(Grey Li)
13
因为默认级联包括 save-update,所以当某个数据库对象被添加进数据库会话时,关联的对象也会一起被添加进去。详情见 5.7.1 小节。