[Django] 关于自动化测试的总结

关于这篇文章

我总结了Python的Web应用程序框架”Django”的自动测试功能。

测试相关页面的官方网站

    • テストチュートリアル

Django におけるテスト

テストを書いて実行する
テストツールリファレンス
テストに関する応用的なトピック

写考试的地方

在运行manage.py startapp时将在tests.py中进行描述。在正式项目中,通常将tests进行封装,并将测试分为test_XXX.py的名称进行分割。根据unittest的规定,以test开头的文件名将被自动测试。

测试的执行方式 de

在Django中,可以通过管理命令manage.py来执行自动化测试。

命令

manage.py test

显示帮助

manage.py help test

usage: manage.py test [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                      [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                      [--noinput] [--failfast] [--testrunner TESTRUNNER]
                      [-t TOP_LEVEL] [-p PATTERN] [-k] [-r] [--debug-mode]
                      [-d] [--parallel [N]] [--tag TAGS]
                      [--exclude-tag EXCLUDE_TAGS]
                      [test_label [test_label ...]]

命令的选项 de

    • -v {0,1,2,3} –verbosity {0,1,2,3}

 

    • 実行ログの詳細レベル。レベル3にするとデータベースの変更タイミング等がわかるので、最初の内はこのオプションを使うと理解が早い。

 

    • -k –keepdb

 

    • 自動テストのデフォルト動作では、毎回データベースを再作成する。このオプションを使うと再作成を回避してデータベースを削除せずに残し、次回実行時に再利用する。

 

    • –settings SETTINGS

 

    単一の設定ファイル(settings.py)のままだと本番環境、開発環境、自動テスト環境を個別に設定することが難しいので、自動テスト用に個別に設定ファイルを作成するのがベストプラクティスとされている。設定ファイルの分割方法については こちら を参照。データベースの設定方法は後述。

指定执行范围

在自动测试中,可以设置执行单位。

# アプリケーション単位
$ ./manage.py test app

# ファイル単位
$ ./manage.py test app.tests

# テストクラス単位
$ ./manage.py test animals.tests.testcase

# メソッド単位
$ ./manage.py test animals.tests.AnimalTestCase.test_can_something

测试的调试方法

如果使用PyCharm,你可以在调试模式下运行自动测试。
参考:为测试创建运行/调试配置。

考试的操作

流程处理

image.png

测试用例类

Django的自动测试是对Python标准测试模块unittest功能进行了扩展。测试用例需要继承django.test.TestCase类来进行编写。与unittest.TestCase的区别如下所示。

    • テストデータの準備にフィクスチャファイルとデータ準備メソッド(setUpTestData)の2つが使える。各処理はテストケースの実行前に一度だけ実行される。

 

    各テストケースはトランザクションで実行され最終的にロールバックされる。また、各テストメソッドも前述のトランザクション内の子トランザクションとして実行され、メソッドごとにロールバックされる。これによりテストケース、テストメソッド毎の独立性が担保される。

数据库设置

这是在settings.py文件中的自动测试数据库设置。假设需要在开发环境的相同数据库服务器上创建另一个数据库。如果单独准备测试配置文件,设置会略显不协调。

参考资料:测试数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '',  
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
        'TEST': {
            'NAME': 'test_database_name',
        }
    }
}

如果没有在TEST.NAME中指定测试数据库名称,则默认的情况如下。

只需要一种选择,请将以下内容用中文进行释义:
对于SQLite3的情况:创建内存数据库(不创建文件)
对于非SQLite3的情况:在主数据库名称前面添加“test_”作为前缀的名称

请注意:默认情况下,每次执行测试时都会创建和删除数据库。因此,连接用户需要具有创建和删除数据库的权限。如果要使用“–keepdb”选项进行操作,则只需要读取权限即可。

参考:如何提交测试数据。

在开发自动化测试或进行特殊测试,如多线程处理时,有时候希望在不回滚数据库的情况下进行提交。在这种情况下,可以使用 “unittest.TestCase” 而不是 “django.test.TestCase”。

Django的自动测试针对的是继承了”unittest.TestCase”的所有类,因此即使它们混杂在一起也没问题。在执行继承”django.test.TestCase”的类之后,会按照控制的顺序依次执行继承”unittest.TestCase”的类。

如何完成考试和介绍图书馆。

创建测试数据 de de test)

可以使用固定文件作为测试数据,但存在以下缺点。

    • データの場所がテストコードと違うファイルになり確認しずらい。

 

    テキストデータはIDEのサポートが得られにくく管理が大変。

因此,使用factory-boy库在测试代码中定义测试数据被认为更合理。factory-boy不仅可以将测试数据的值描述为具体的逻辑,还可以更轻松地创建具有复杂值和结构的数据,而不是使用固定的数据。

以下是参考链接:

    • Github factory_boy

 

    • くろねこ日記 テストデータ作成に便利なFactoryBoyをつかってみた

 

    • Python: factory-boy でテストに使うオブジェクトを作る

factory-boyとDjangoでテストを書くときにファイルをうまく使う

FileFieldにダミーデータを設定する方法を紹介

覆盖范围的测量

计算代码覆盖率(测试的代码覆盖度)需要使用”Coverage.py”工具。以前使用的是django-nose、django-coverage等包,但现在官方推荐使用”Coverage.py”。

    • Github Coverage.py

 

    • Django公式: Integration with coverage.py

 

    • もた日記 Djangoメモ(26) : coverage.pyでカバレッジ(網羅率)を計測

 

    Qiita:Coverage.pyでDjangoアプリケーションのカバレッジを計測する

在中文中,使用方法很简单,通过在终端运行`pip install coverage`安装Coverage.py后,使用Coverage.py通过执行测试生成结果文件,并在控制台上显示报告,或者以HTML格式输出。有关排除设置等更多信息,请参阅链接。

# テスト実行
coverage run --source='.' manage.py test myapp
# レポート出力
coverage report
# HTML出力
coverage html

单元测试

请参考 Python 标准库中的 unittest,以进行单元测试。
以下文章整理了很好,可以先查看一下。

    • Pythonのデバッグとテストモジュール

 

    Python Django チュートリアル(7)

我还参考了下面的文章。

    • unittest 単体テスト入門 その1 基本的な使い方

 

    • python標準のunittestの使い方メモ

 

    Djangoのテストの書き方について勉強したのでまとめる

集成测试

Django的测试框架提供了一个名为django.test.Client的模块。使用这个模块,可以向Django应用程序发送虚拟的HTTP请求,并接收响应结果。由于可以在不启动Web服务器的情况下进行测试,因此与使用实际浏览器进行UI测试相比成本较低(但无法执行JavaScript)。

    Django公式:テストツール:テストクライアント

然而,在Ruby On Rails中,担任类似角色的Capybara具有以下Django测试客户端所没有的功能,这导致了测试的自由度不足。

    • CSSセレクタを使って特定のDOMオブジェクトを取得する。

 

    aタグをクリックしてハイパーリンク先に遷移する。

推荐的是django-webtest库。
这是一种使python的webtest库可以在Django中使用的方法。

使用它,可以将响应的HTML页面作为Beautiful Soup对象进行处理,从而方便地使用CSS选择器或a标签进行超链接转移。

请查阅以下内容:

    • Github:django-webtest

 

    • webtest:Testing Applications with WebTest

 

    • メモ的な思考的な:Pythonで、WebTestを使って、WSGIサーバを起動せずにWSGIアプリのテストをする

 

    Qiita:PythonとBeautiful Soupでスクレイピング

用户界面测试

你可以在Django中使用Selenium进行UI测试。Django提供了使用Selenium进行测试的模块。请参考官方网站创建测试用例。

    Django公式:LiveServerTestCase

以上是全部内容。