Django框架自动化测试小结
1.自动化测试是什么?
测试,是用来检查代码正确性的一些简单的程序。
测试在不同的层次中都存在。有些测试只关注某个很小的细节(某个模型的某个函数的返回值是否满足预期),而有些测试可能检查对某个软件的一系列操作(某一用户输入序列是否造成了预期的结果)。我们可以自己编写代码手动测试,也可以编写代码进行自动化测试。在实际生产中,自动化测试是必不可少的。
为什么实际生产中自动化测试是必不可少的呢?因为它可以在你的程序修改的时候告诉你是否对原先功能产生影响。不同于之前的手动测试,自动化测试是你预先创建一部分例子,在你修改代码后运行这些例子然后检查结果是否仍是你需要的。这样就可以省去每一次手工测试的时间。在实际开发时,一般项目工程都比较大,需要进行人员的分工,有专门开发业务逻辑的人,也有专门写测试的人。因此编写自动化测试相比手动测试不仅能够实现任务分离,还能提高团队的开发效率,保证业务代码的鲁棒性。
本篇博客将基于Django框架简要介绍如何实现自动化测试。
2.TestCase架构
以下将从一个简单的例子说起:
在创建myapp应用时,Django默认已经生成了tests.py测试文件,打开myApp应用下tests.py文件,就可编写针对模型的测试用例。
代码如下:
from django.test import TestCase
from myapp.models import Animal
class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name="lion", sound="roar")
Animal.objects.create(name="cat", sound="meow")
def test_animals_can_speak(self):
lion = Animal.objects.get(name="lion")
cat = Animal.objects.get(name="cat")
self.assertEqual(lion.speak(), 'The lion says "roar"')
self.assertEqual(cat.speak(), 'The cat says "meow"')
这个例子是测试myapp.models中的Animal类相关方法功能的简单单元测试。
可以看到:from django.test import TestCase
是指从Django.test中引入TestCase框架,并在自己新建的测试类中继承它。继承之后对于此类的每一个以test开头的函数会有一个周期调用:setUp
函数->以test开头的函数->tearDown
函数。
通常我们可以在setUp
函数里做一些初始化工作,然后在tearDown
函数里做一些测试结束后的析构工作。在以test开头的函数里写单元测试代码,对相应模型的一个方法进行测试。
如以上代码在setUp
函数中就在数据库中创建了两条记录,然后在以test开头的test_animals_can_speak
函数中进行了测试。若一个test函数中所有的断言正确则此条测试通过。以上代码的test_animals_can_speak
函数中若两个断言函数的两个参数都相等则测试通过,否则此test函数的测试失败。
常用的断言函数有:
断言函数 | 类比 |
---|---|
assertEqual(a, b) | a == b |
assertNotEqual(a, b) | a != b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIsInstance(a, b) | isinstance(a, b) |
assertNotIsInstance(a, b) | not isinstance(a, b) |
由此可见,基于Django自带的TestCase框架我们可以较为轻松的编写自动化测试。只需最后在Django项目的manage.py同级目录下进入命令行键入测试命令即可进行自动化测试。
- 使用命令
python manage.py test
可以执行此Django项目下所有的测试文件 - 使用命令
python manage.py test app
可以执行此Django项目下app应用的测试文件 - 使用命令
python manage.py test app.case_name
: 可以执行此Django项目下app应用的指定的测试用例
对于如上示例代码,在manage.py的命令行中键入命令python manage.py test
即可进行测试。
若测试成功,即每个断言函数的第一个参数的Animal实例的speak函数返回的字符串确实和其第二个参数相等。则会有以下输出:
$ python manage.py test
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.012s
OK
Destroying test database for alias 'default'...
可以看到由于此单元测试文件只有一个测试函数,故只测试成功了一个测试用例,最后返回OK。
也可以看到两行信息输出:Creating test database for alias 'default'...
和Destroying test database for alias 'default'...
这两行信息暗藏玄机。
实际上,默认情况下模型测试不会使用“真实”的数据库,而会为测试创建单独的空白数据库。无论测试是通过还是失败,测试数据库都会在执行前创建并在执行完所有测试后被销毁。当然,它的配置可以在Django项目的Setting.py文件中去修改。例如使用“真实”的数据库,测试数据库的名字,字符集等等。
3.Coverage配置
测试覆盖率,简单的说,就是评价测试活动覆盖产品代码的指标。测试的目的,是确认产品代码按照预期一样工作,也可以看作是产品代码工作方式的说明文档。进一步考虑,测试覆盖率可以看作是产品代码质量的间接指标。之所以说是间接指标,因为测试覆盖率评价的是测试代码的质量,并不是产品代码的质量。代码覆盖率是一种白盒测试,因为测试覆盖率是评价产品代码类内部的指标,而不是评价系统接口或规约。测试覆盖率尤其用于评价测试代码是否已经覆盖了产品代码所有的路径。
coverage包提供了方便的测试代码覆盖率的功能。Django可以轻松地与coverage包集成。
安装方式:
-
可在此处查看官方文档:https://coverage.readthedocs.io/en/latest/
-
可在此处获取下载地址:http://pypi.python.org/pypi/coverage
-
也可以通过easy_install或pip安装:
easy_install coverage
。安装后在Python27\Scripts文件夹下生成coverage.exe等工具,在path中加环境变量C:\Python27\Scripts,便可以在命令行中调用coverage命令来进行覆盖率分析。
运行命令:
在Django项目的manage.py同级目录的命令行下输入
`coverage run --source='.' manage.py test myapp`
其中myapp为应用名称。这将运行测试并收集项目中已执行文件的覆盖率数据。
然后可以通过键入以下命令来查看此数据的报告:
coverage report
更多
欢迎联系博主:TXYPotato@gmail.com