测试定义
软件测试(英语:Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。
测试分类
1、单元测试
**单元测试即为将整个软件分解为各个功能,随后对单元进行测试。**此类测试策略的优点在于所需分析数据较少,且针对性较强,程序开发者于开发过程中可通过操作经验明确出现问题的大致区域,随后针对此类问题对相关单元展开分析,进行问题排查。但需注意的是,某些程序中无具体单元驱动程序,即单个单元无法有效驱动,易出现问题,若针对此类软件展开测试,需重点注意此类分解单元。
2、集成测试
集成测试与单元测试相反,原理为将部分需测试部分作为整体进行集成,随后针对此类集成部分进行测试。测试要求为此类被测试集成题应具有一定的结构,且属于非渐增方式集成。对于较大软件而言,集成测试方式较单元测试方式而言较为繁琐,目前多数大型软件的测试皆采取渐增方式进行测试。渐增测试方式为集成测试方式的衍生,其能够按照不同次序对软件进行测试,日常测试中,常将两类方式进行集成测试,随后按照次序展开选择。
3、黑盒测试
**黑盒测试,顾名思义即为将软件测试环境模拟为不可见的“黑盒”。通过数据输入观察数据输出,检查软件内部功能是否正常。**测试展开时,数据输入软件中,等待数据输出。数据输出时若与预计数据一致,则证明该软件通过测试,若数据与预计数据有出入,即便出入较小亦证明软件程序内部出现问题,需尽快解决。
4、白盒测试
**白盒测试相对于黑盒测试而言具有一定透明性,原理为根据软件内部应用、源代码等对产品内部工作过程进行调试。**测试过程中常将其与软件内部结构协同展开分析,最大优点即为其能够有效解决软件内部应用程序出现的问题,测试过程中常将其与黑盒测试方式结合,当测试软件功能较多时,白盒测试法亦可对此类情况展开有效调试。其中,判定测试作为白盒测试法中最为主要的测试程序结构之一,此类程序结构作为对程序逻辑结构的整体实现,对于程序测试而言具有较为重要的作用。此类测试方式针对程序中各类型的代码进行覆盖式检测,覆盖范围较广,适用于多类型程序。实际检测中,白盒测试法常与黑盒检测法并用,以动态检测方式中测试出的未知错误为例,首先使用黑盒检测法,若程序输入数据与输出数据相同,则证明内部数据未出现问题,应从代码方面进行分析,若出现问题则使用白盒测试法,针对软件内部结构进行分析,直至检测出问题所在,及时加以修改。
python单元测试模块——unittest
断言定义
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
#断言 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看
#作是异常处理的一种高级形式。
#assert代表断言,假设断言的条件为真,如果为假诱发AssertionError
#assert 断言的条件,错误的提升
a = 0
assert a,"a is false"
print(a)
#上面的断言代码类似下面的if语句
a = 1
if not a:
raise AssertionError("a is false")
print(a)
断言的优势
1、编写防御性代码
2、起到特殊的注释作用
TestCase(测试用例): 所有测试用例的基类,它是软件 测试中最基本的组成单元。一个test case就是一个测试用例,是一个完整的测试流程,包括测试前环境的搭建setUp,执行测试代码(run),以及测试后环境的还原(tearDown)。测试用例是一个完整的测试单元,可以对某一问题进行验证。
TestSuite(测试套件):多个测试用例test case集合就是TestSuite,TestSuite可以嵌套TestSuite
**TestLoder:**是用来加载 TestCase到TestSuite中,其中有几个loadTestsFrom_()方法,就是从各个地方寻找TestCase,创建他们的实例,然后add到TestSuite中,再返回一个TestSuite实例
**TextTestRunner:**是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
**TextTestResult:**测试结果会保存到TextTestResult实例中,包括运行了多少用例,成功与失败多少等信息
**TestFixture:**又叫测试脚手,测试代码的运行环境,指测试准备前和执行后要做的工作,包括setUp和tearDown方法
import unittest
#unittest使用的方法
class OurTest(unittest.TestCase):
"""
继承编写测试的基础类
"""
def setUp(self):
"""
类似于类的init方法,在测试执行之初制动执行,通常用来做测试数据的准备
"""
def test_add(self):
"""
具体测试的方法,使用testcase编写具体测试的方法,函数名称必须以test开头
函数当中的内容通常是获取预期值,和运行结果值
然后对两个值进行断言
"""
def tearDown(self):
"""
类似类的del方法,用来回收测试的环境
"""
if __name__ == "__main__":
unittest.main()
#-------------------------------------------------------------------------
import unittest
class OurTest(unittest.TestCase):
"""
继承编写测试的基础类
"""
def setUp(self):
"""
类似于类的init方法,在测试执行之初制动执行,通常用来做测试数据的准备
"""
self.a = 1 #测试使用的参数1
self.b = 1 #测试使用的参数2
self.result = 3 #预期的结果
def test_add(self):
"""
具体测试的方法,使用testcase编写具体测试的方法,函数名称必须以test开头
函数当中的内容通常是获取预期值,和运行结果值
然后对两个值进行断言
unittest模块已经封装好了更多的断言方法
"""
run_result = self.a + self.b
self.assertEqual(run_result,self.result,"self.a+self.b不等于3") #断言两个值相等
def tearDown(self):
"""
类似类的del方法,用来回收测试的环境
"""
if __name__ == "__main__":
unittest.main()
断言常用的方法
断言方法—————》断言描述
assertEqual(arg1, arg2, msg=None)—————》验证arg1=arg2
assertNotEqual(arg1, arg2, msg=None)—————》验证arg1 != arg2
assertTrue(expr, msg=None)——————-———————》验证expr是true,如果为false
assertFalse(expr,msg=None)—————————————》验证expr是false,如果为true
assertIs(arg1, arg2, msg=None)—————————》验证arg1、arg2是同一个对象
assertIsNot(arg1, arg2, msg=None)———————》验证arg1、arg2不是同一个对象
assertIsNone(expr, msg=None)———————————》验证expr是None
assertIsNotNone(expr, msg=None)—————————》验证expr不是None
assertIn(arg1, arg2, msg=None)—————————》验证arg1是arg2的子串
assertNotIn(arg1, arg2, msg=None)—————————》验证arg1不是arg2的子串
assertIsInstance(obj, cls, msg=None)———————》验证obj是cls的实例
ssertNotIsInstance(obj, cls, msg=None)—————》验证obj不是cls的实例
python web自动化测试模块 selenium
Selenium 本来就是web功能测试的一个很棒的工具,之前和python没有关系,后来python编写调用selenium的模块。使用python可以驱动selenium然后驱动浏览器内核进行浏览器控制,所以selenium通常用于自动化测试和爬虫两个方向的代码。
Selenium在python当中是一个三方模块,安装需要先安装selenium模块,然后安 装对应的浏览器模块。
1,安装selenium模块
activate DjangoPath——》下切换到配置环境的路径下
pip install selenium——》安装selenium模块,
2,安装浏览器的驱动
①首先查看版本浏览器
②查看表格对应版本
驱动版本——————————————浏览器版本
ChromeDriver 76.0.3809.12 (2019-06-07)---------Supports Chrome version 76
ChromeDriver 75.0.3770.8 (2019-04-29)---------Supports Chrome version 75
ChromeDriver v74.0.3729.6 (2019-03-14)--------Supports Chrome v74
ChromeDriver v2.46 (2019-02-01)----------Supports Chrome v71-73
ChromeDriver v2.45 (2018-12-10)----------Supports Chrome v70-72
ChromeDriver v2.44 (2018-11-19)----------Supports Chrome v69-71
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71
ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70
ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69
ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68
ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68
ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67
ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66
ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65
ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64
③安装chrome的驱动
http://npm.taobao.org/mirrors/chromedriver/——》安装chrome的驱动
④将驱动放到一个配置了path环境变量的目录当中
⑤编写一段测试代码
from selenium import webdriver
#实例化一个浏览器驱动
chrome = webdriver.Chrome()
#访问页面
chrome.get("https://www.baidu.com/")
#捕获元素
inputs = chrome.find_element_by_id("kw")
#对元素进行操作
inputs.send_keys("老边饺子")
button = chrome.find_element_by_id("su")
button.click()
#关闭浏览器
chrome.close()
unittest与selenium模块的结合
import unittest
from time import sleep
from selenium import webdriver
class YouJiuyeTest(unittest.TestCase):
def setUp(self):
self.chrome = webdriver.Chrome()
self.chrome.get("http://xue.ujiuye.com/foreuser/login/")
def test_login_password(self):
username_d1 = self.chrome.find_element_by_id("username_dl")
password_dl = self.chrome.find_element_by_id("password_dl")
button = self.chrome.find_elements_by_class_name("loginbutton1")
username_d1.send_keys("13331153361")
password_dl.send_keys("123")
button[0].click()
text = self.chrome.find_element_by_id("J_usernameTip").text
self.assertEqual("密码应该为6-20位之间!",text,"密码太短提示内容有误")
def test_login_username(self):
username_d1 = self.chrome.find_element_by_id("username_dl")
password_dl = self.chrome.find_element_by_id("password_dl")
button = self.chrome.find_elements_by_class_name("loginbutton1")
username_d1.send_keys("13331153361")
password_dl.send_keys("123456789")
button[0].click()
text = self.chrome.find_element_by_id("J_usernameTip").text
self.assertEqual("账号不存在", text, "提示内容有误")
def tearDown(self):
sleep(10)
self.chrome.close()
if __name__ == '__main__':
unittest.main()
#结构优化
import unittest
from time import sleep
from selenium import webdriver
class YouJiuyeTest(unittest.TestCase):
def setUp(self):
self.chrome = webdriver.Chrome()
self.chrome.get("http://xue.ujiuye.com/foreuser/login/")
def login(self,username,pasword):
username_d1 = self.chrome.find_element_by_id("username_dl")
password_dl = self.chrome.find_element_by_id("password_dl")
button = self.chrome.find_elements_by_class_name("loginbutton1")
username_d1.send_keys(username)
password_dl.send_keys(pasword)
button[0].click()
text = self.chrome.find_element_by_id("J_usernameTip").text
return text
def test_login_password(self):
text = self.login("13331153361","123")
self.assertEqual("密码应该为6-20位之间!",text,"密码太短提示内容有误")
def test_login_username(self):
text = self.login("13331153361","12345678")
self.assertEqual("账号不存在", text, "提示内容有误")
def tearDown(self):
sleep(10)
self.chrome.close()
if __name__ == '__main__':
unittest.main()
python生成测试报告
HTMLTestRunner 模块时python三方的生成测试报告的模块,他可以将python unittest模块测试的结果编写成一个html报告。Htmltestrunner 只支持python2 ,python3如果进行使用,需要手动修改源码。
1,下载HTMLTestRunner模块
https://pypi.org/project/HTMLTestRunner/
2,复制源码到python三方目录下的HTMLTestRunner.py当中
3,按照python3 修改源码
①94行将import stringio 改为 import io
②539行 将stringio改为io
③631行 修改print格式
④642行 将has_key 改为not in
⑤766行 将decode改为encode
⑥772行 将decode改为encode
代码如下:
import unittest
from time import sleep
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner
class YouJiuyeTest(unittest.TestCase):
def setUp(self):
self.chrome = webdriver.Chrome()
self.chrome.get("http://xue.ujiuye.com/foreuser/login/")
def login(self,username,pasword):
username_d1 = self.chrome.find_element_by_id("username_dl")
password_dl = self.chrome.find_element_by_id("password_dl")
button = self.chrome.find_elements_by_class_name("loginbutton1")
username_d1.send_keys(username)
password_dl.send_keys(pasword)
button[0].click()
text = self.chrome.find_element_by_id("J_usernameTip").text
return text
def test_login_password(self):
text = self.login("13331153361","123")
self.assertEqual("密码应该为6-20位之间!",text,"密码太短提示内容有误")
def test_login_username(self):
text = self.login("13331153361","12345678")
self.assertEqual("账号不存在", text, "提示内容有误")
def tearDown(self):
sleep(10)
self.chrome.close()
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(YouJiuyeTest("test_login_password"))
suite.addTest(YouJiuyeTest("test_login_username"))
with open("report.html","wb") as f:
runner = HTMLTestRunner(
stream=f,
title="教学测试",
description="就是一个教学测试"
)
runner.run(suite)