测试的分类
测试从软件开发过程可以分为:
1.单元测试
对单独的代码块(例如函数)分别进行测试,以保证它们的正确性。
单元测试就是开发者编写一小段代码,检验目标代码的功能是否符合预期。
单元测试实际上就是一些“断言”(assert)代码。判断结果是布尔值。如果为True,则pass。反之,则报异常。
2.集成测试
对大量的程序单元的协同工作情况做测试
3.系统测试
同时对整个系统的正确性进行检查,而不是针对独立的片段
在众多的测试中,与程序开发人员最密切的就是单元测试,因为单元测试是由开发人员进行的,而其他测试都由专业的测试人员来完成。所以我们主要学习单元测试。
常用的断言方法:
assertEqual :如果两个值相等,则pass。
assertNotEqual:如果两个值不相等,则pass。
assertTrue:如果bool值为True,则pass。
assertFalse:如果bool值为False。则pass。
assertIsNot:不存在,则pass。
assertISNotNone:存在,则pass。
单元测试的基本写法
1.首先,定义一个类,继承自unittest.TestCase
import unittest
class TestClass (unittest.TestCase):
pass
2.其次,在测试类中,定义两个测试方法:
import unittest
class TestClass(unittest.TestCase):
#该方法会首先执行,方法名为固定写法
def setUp(self):
pass
#该方法会在测试代码执行完后执行,方法名为固定写法
def tearDown(self):
pass
3.最后,在测试类中,编写测试代码
import unittest
class TestClass(unittest.TestCase):
#该方法会首先执行,相当于做测试前的准备工作
def setUp(self):
pass
#该方法会在测试代码执行完后执行,相当于做测试后的扫尾工作
def tearDown(self):
pass
#测试代码(以test_开头)
def test_app_exists(self):
pass
对数据库进行测试
# 导入测试框架
import unittest
测试作者图书案例
from demo_author_book import *
# 定义测试类,模拟添加数据
class DatabaseTest(unittest.TestCase):
# 类似于初始化方法__init__,首先执行,一般用来配置基本的信息,指定数据库的连接、构建测试客户端等
def setUp(self):
# 开启测试标记,可以帮助定位测试的信息
# app.config['TESTING'] = True
# 指定链接的数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost/demo_test'
# 创建 数据库表
db.create_all()
# 类似于析构方法__del__,最后执行,一般用来清除数据,清除数据库会话对象
def tearDown(self):
# 移除数据库会话对象,如果没有移除数据库会话对象,会导致在进行测试时程序一直运行,无法结束。
db.session.remove()
db.drop_all()
# 定义测试方法
def test_add_data(self):
name = Author(name='wax')
age = Book(info='18')
db.session.add_all([name,age])
db.session.commit()
# 查询数据库确认数据存在
it = Author.query.filter_by(name='wax').first()
bk = Book.query.filter(Book.info=='18').first()
# 使用断言
self.assertIsNotNone(it)
self.assertIsNotNone(bk)