测试用程序实例疑问


#1

运行测试用例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()

#2

这句与以下这句效果一样吗?

db.session.add_all([item1, item2, item3, item4])

#3

session.commit()前还要加一句session.add(user)


#4

flask run是项目启动,要执行测试请用python执行。仔细看书。

python test_app.py

#5

谢谢!李老师书本也少了这句,得加上。
可我运行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>

#6

你执行测试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
}

#7

谢谢,数据库明白了,但为什么执行python test_ui.py就直接跳出了呢?


#8

tests文件夹里的代码不能直接用python执行的。

运行所有测试应该这么运行

python -m unittest discover -v

单独运行某个测试的话,具体看书本【12.3.4 运行测试】


#9

用这个命令也一样,好像没测试!

 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

#10

的确是没有,如果这是你自己的工程,你可能要对比下原工程。

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

#11

不是我的工程,书中范例,有点蒙,自己再理理!


#12

原因找到了,这tests目录必须是子包形式,也就是必须要有__init__.py空文件,否则不会寻找!


#13

因为默认级联包括 save-update,所以当某个数据库对象被添加进数据库会话时,关联的对象也会一起被添加进去。详情见 5.7.1 小节。