什么是单元测试?
- 指对软件中的最小可测试单元进行检查和验证
- 单元:函数或者类
- 单元测试:测试类或者函数
为什么要做单元测试?
- 便于后期重构
- 优化设计
- 文档记录
- 具有回归性
- 投入小,收益大,能够精准的更早的发现问题
单元测试和测试人员有什么关系?
- python 很难测试 java 的单元
- 关键是单元测试一般是开发或者测试开发做的
测试有哪些?
- 集成测试**
- 在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试
- 系统测试
- 系统测试,英文是System Testing。是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方
- 验收测试
- 验收测试是部署软件之前的最后一个测试操作。在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的软件测试活动
单元测试框架:
- 内置的单元测试框架:unittest
unittest注意事项:
- 模块名称 test_
- 类名 test…
- 测试用例的方法名称 test_…
- TestLogin(unittest.TestCase
unittest 测试用例执行顺序
- 不是从上到小
- 根据测试用例的名称 ===>> ASCII
'''
测试登陆功能(函数)
'''
#coding=utf-8
import unittest
def login(username = None,password = None):
#登陆'''
if (not username) or (not password):
#登陆名or密码为空
return {'msg':'empty'}
if username == 'csdn' and password == '123456':
#登陆名和密码正确
return {'msg':'success'}
return {'msg':'error'}
def login(username = None,password = None):
if (username != None) and (password != None):
if username == 'csdn' and password == '123456':
return {'msg':'success'}
else:
return {"msg": "username or password error"}
else:
return {"msg": "username or password error"}
#测试用例编写:
class TestLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
print ("一个测试类只执行一次的前置")
@classmethod
def tearDownClass(cls):
print ("一个测试类只执行一次的后置")
def setUp(self):
"""前置"""
print("链接数据库")
def tearDown(self):
"""后置"""
print("断开数据库")
def test_login_success(self):
username = "csdn"
password = "123456"
expected_response = {"msg": "success"}
# 调用被测试的单元,
actual_response = login(username, password)
#判断预期结果和实际结果是否存在某种关系 , 断言 assert
self.assert_(expected_response == actual_response)
def test_login_error(self):
username = ""
password = ""
expected_response = {"msg": "username or password error"}
# 调用被测试的单元,
actual_response = login(username, password)
# 判断预期结果和实际结果是否存在某种关系 , 断言 assert
self.assert_(expected_response == actual_response)
if __name__ == '__main__':
# 使用 python 运行这个模块里面的测试用例
unittest.main()
用例执行
- 右击unittest 运行
- python 运行 unittest.main()
- 运行所有的测试用例
用例的组织
- 会把测试用例的代码放到一个统一的文件夹当中,目录当中
- tests / testcases
收集用例
- 需要把每个测试用例模块当中的测试用例收集到一起,一起执行
运行用例的流程
- 写用例方法。用例方法当道一个目录当中
- 写脚本run.py ( 收集用例,运行用例)
- loader 收集用例 ,suite = discover()
- 得到测试集 suite
- 运行, test_runner = HTMLTestRunner()
Excel操作
- 通过 python 操作 Excel,是因为现在主流的测试用例的数据是写在 Excel 当中的。
Excel 是一种比较规范的数据格式。 - 自动化测试的用例数据:excel, csv, yaml
读取Excel步骤
- 打开文件,得到一个workbook
- 选择表单
- 通过行列读取数据
""运行程序脚本
- 收集所有的测试用例
- 执行所有的测试用例
- 生成测试报告
"""
#coding=utf-8
import unittest
import os
#初始化一个加载器 test_loader
from HTMLTestRunnerNew import HTMLTestRunner
from class16_test.test import test_login,test_register
loader = unittest.TestLoader()
#获取测试用例目录的路径
dir_path = os.path.abspath(__file__)
case_path = os.path.join(dir_path,"test")
# 使用 loader 收集所有的测试用例
test_suit = loader.discover(case_path)
print(test_suit)
# 只加载注册的和登录的用例
suit_login = loader.loadTestsFromModule(test_login)
suit_register = loader.loadTestsFromModule(test_register)
# 初始化一个 suite
suit_total = unittest.TestSuite()
suit_total.addTests([suit_login, suit_register])
# 执行测试用例
runner = unittest.TextTestRunner()
runner.run(test_suit)
#生成测试报告
with open("test_reports.txt", 'w', encoding='utf-8') as f:
runner = unittest.TextTestRunner(f)
runner.run(test_suit)
#或者自己准备一个HTML 测试报告模版, 不是内置。是需要自己准备的。
with open("test_reports.html", 'wb') as f:
runner = HTMLTestRunner(
f,
title='python29期第一次测试报告',
description="测试报告的描述",
tester='yuz'
)
runner.run(suit_total)