测试部分笔记

1.测试基础知识

1.什么是软件测试
答:软件测试就是验证软件功能是否满足用户需求
测试左移:需求前调研阶段和需求阶段,测试人员参加。
测试右移:产品上线后,系统监控,日志记录和分析。

2.什么是测试用例?
答:向被测试系统发起的一组集合,这组集合包括测试数据、测试步骤、测试平台、预期结果。

3.开发模型
1)瀑布模型
start—>需求分析—>计划—>设计—>编码—>测试—>end
优点:强调开发的阶段性,强调早期计划及需求调查,强调产品测试,各阶段比较独立。
缺点:无法适应需求的变化;测试到编码后才介入,导致前期的缺陷无法及时发现。无法及时修正。
适用的项目:适用于需求稳定的项目

2)螺旋模型
适用的项目:前期需求不是很明确,并且有风险,项目比较庞大的系统开发;
优点:强调软件质量,每一次迭代进行严格的风险分析,提供讨论项目是否有必要进行下去的机会。
缺点:引入风险管理,会投入大量人力物力。

3)迭代、增量模型
一个系统四个功能 A、B、C、D模块,两周时间完成
迭代模型:第一周完成 A、B、C、D,第二周细化和完善
增量模型:第一周 A、B 第二周C、D
迭代模型抗风险能力更强

4)敏捷模型
轻文档、轻流程,重目标、重质量,交付一个高质量的可以用软件可以适应需求的变化

软件开发的生命周期:需求分析—>计划—>设计—>编码—>测试—>运行维护

4.测试用例的基本要素
向测试系统发起的一组集合,测试平台、测试数据、测试步骤、预期结果等。

5. 如何判断一个测试工程师是否优秀?
**耐心:**发现问题后,我们需要多测试几次,确保能够复现并详细的记录下复现步骤,同时尝试拓展思考一下,是否在其他平台、其他职业、其他模块存在同样的问题。确保这些工作都做完之后,再去把问题跟开发和策划讨论下,可能更合适一些。

细心:
**责任心:**责任心也体现在游戏测试人员不仅仅要关注导致游戏无法运行或者功能不正常的bug,也要关注一些对于别人来说无关紧要的事情,当你向策划或者程序们提出的时候会遇到一些冷漠的态度亦或是非议,你也依然要把这些问题提出,并尽可能提供解决的建议。

沟通表达能力:

**勤思考:**不思考总结的测试人员永远只能停留在当前的水平、永远只能机械的重复工作。发现bug后,要思考为何会产生这个bug,背后的原理是什么,有没有其他模块可以借鉴的测试方法、测试用例为何没有覆盖、如何完善测试用例?发现重复性劳动后,要思考能不能通过一定的技术手段来帮助我们提高测试效率?游戏中发现大量相同的bug时,要思考有没有办法通过自动化检查来实现此类问题的再次出现?周版本、重要对外版本发布后,要思考这次的测试流程是否合理?面对不同类型的游戏、不同的功能模块,要思考测试方法是否合理得当?

产品意识
需求熟悉度

作者:网易数帆
链接:https://www.zhihu.com/question/36016892/answer/451813880
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.设计测试用例的方法

需求分析—>软件需求—>开发软件 —>测试功能 —>上线
1.根据需求去设计测试用例

  • 验证需求的正确性
  • 分析需求,细化需求,从需求中提炼功能模块,划分子功能根据每一个子功能去写测试用例。

2.具体的设计测试用例的方法
1)等价类
把输入划分成若干各等价类,从每一个等价类当中选一个有代表性的测试用例进行测试,如果这个测试用例测试通过,那我们就说这个测试用例代表的等价类测试通过。
2)边界值
针对输入输出的边界进行测试用例的设计。
等价类+边界值—> 进行测试用例的设计
3)因果图法
因果图是一种逻辑图
当输入有很多,不同输入的组合对应不同的输出,用因果图来分析不同输入组合和不同输出之间的关系。
用因果图法设计测试用例的步骤:
(1)分析出所有的输入和输出
(2)找出输入输出之前的逻辑关系
(3)根据输入输出的关系画因果图
(4)根据因果图画判定表
(5)根据判定表设计测试用例

4)正交法
研究多因素多水平的一种实验(测试)方法。根据正交性,从输入组合当中选最优的组合进行试验、分析结果。通过这些最优组合得出的试验结果来分析这个试验的结果。
因素:输入的变量
水平:变量的取值
正交表构成:
列:因素数,变量的个数
行:因素的最大的变量个数
水平数:每个变量的最大个数
L(正交表的行) = (水平数-1)x 因素数+1

正交表的性质:
(1)每一列不同数据出现的次数一致
(2)任意两列不同数据的组合出现的次数一样

5)场景法
6)错误猜测法

3.按开发阶段划分
单元测试
测试阶段:编码前(TDD)编码后
Test-Driven-Develop测试驱动开发
测试内容:单元接口测试(按照接口设计文档,参数,输出)局部数据结构测试(局部变量)边界测试.
java 、 Junit

集成测试
按照一定的策略把单元模块组装起来
测试内容:模块之间数据的传输(输入输出,参数),模块之间功能的冲突,全局数据结构,单个模块的缺陷对象整个功能的影响。
API接口
系统测试
对被测软件应用系统进行全面的系统的测试
测试内容:功能,界面,性能,安全性,兼容性,可靠性,可移植性等

  • 回归测试:当系统引入新代码(出现新功能,修改了BUG)的时候进行回归测试
  • 冒烟测试:判断系统是否可以进行全面系统测试的标准验收测试

4.按照实施组织划分
a测试,β测试
测试环境:a在开发环境,β在实际使用环境
测试人员:a测试出来开发人员和测试人员以外的任何人,β测试是实际用户在进行β测试前要进行很长一段时间的a测试。

5.按是否查看代码划分
黑盒测试:把软件当成一个黑色的盒子,软件的具体实现是被屏蔽的,只关心软件的输入与输出。
测试方法:等价类、边界值、因果图法、场景法、错误测试法、正交法
白盒测试:对软件的具体实现,程序的逻辑和结构进行测试
测试方法:语句覆盖、路径覆盖、循环覆盖、逻辑覆盖(判定覆盖、条件覆盖、判定和判定组合覆盖、条件和条件组合覆盖、判定和条件组合覆盖)

6.性能测试
在这里插入图片描述

面试题1:给一个登陆界面该如何测试?

1.功能测试 (Function test)

1)输入正确的用户名和密码,点击提交按钮,验证是否能正确登录
2)输入错误的用户名或者密码, 验证登录会失败,是否有相应的错误提示信息
3)登录成功后是否跳转到正确的页面
4)用户名和密码,如果太短或者太长,应该怎么处理
5)用户名和密码,中有特殊字符,和其他非英文的情况
6)记住用户名和密码的功能
7)登陆失败后,不能记录密码的功能
8)用户名和密码输入时前后有空格的处理
9)密码是否可见,是否用星号标识

2.界面测试 (UI Test)

1)布局是否合理,2个 Testbox 和一个按钮是否对齐
2)Testbox和按钮的长度、高度是否复合要求
界面是否美观
3)图片,颜色,字体,超链接,是否都显示正确

3.性能测试 (performance test)

1)打开登录页面,需要几秒
2)输入正确的用户名和密码后,登录成功跳转到新页面,不超过5秒
3)能支持多少个用户同时登陆

4.安全性测试 (Security test)

1)登录成功后生成的Cookie,是否是httponly (否则容易被脚本盗取)
2)用户名和密码是否通过加密的方式,发送给Web服务器
3)用户名和密码的验证,应该是用服务器端验证, 而不能单单是在客户端用javascript验证
用户名和密码的输入框,应该屏蔽SQL 注入攻击
用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击)
4)错误登陆的次数限制(防止暴力破解)

5.可用性测试 (Usability Test)

1)是否可以全用键盘操作,是否有快捷键
2)输入用户名,密码后按回车,是否可以登陆

6.兼容性测试(Compatibility Test)

1)主流的浏览器下能否显示正常(IE/Edge, Firefox, Chrome, Safari 等)
2)不同的平台是否能正常工作,比如Windows, Mac
3)移动设备上是否正常工作,比如iPhone, Andriod
4)不同的分辨率
5)不同的浏览器大小(浏览器最大化, 和非最大化)

面试题2:微信、qq发消息功能测试用例

功能测试:
1.消息内容类型测试:纯文字、纯图片,纯表情、文字+表情、文件
2.发送键测试:测试发送键能否正常使用、使用快捷键发送(电脑端)
3.用户在线状态测试:是否在线或已离线
4.网络情况:网络正常、网络异常
5.群聊是否正常:@功能(@ 个人、@多个人、@所有人)、提醒功能(被@到时,进入群聊是否提示“有人@”)

测试用例如下:
1.单聊:发送文字/表情/图片,对方是否能接收成功,且消息发送时间排序正常,聊天记录条数是否正常

2.群聊:发送文字/表情/图片,对方是否能接收成功,且消息发送时间排序正常,聊天记录条数是否正常

3.离线状态下,是否支持消息发送?发送失败后,是否支持重新发送?

4.离线状态下,是否支持接收消息?在线后,是否正常接收到离线消息?

5.未加好友状态下:搜索QQ号开启的临时会话,是否能发送文字/表情/图片/文件;群聊开启的临时会话,群主没有设置不可发起临时会话,是否能发送文字/表情/图片/文件;群主设置了不可发起临时会话,是否能发送文字/表情/图片/文件

6.在线用户发送文件给离线用户,发送到一半时,中断后,是否能继续再次发送

7.在线用户发送文件时,是否能够正常接收

8.屏蔽功能开启和关闭:屏蔽功能开启后,是否屏蔽消息提醒,但是还是可以点开查看消息?屏蔽功能关闭后,是否正常接收消息并提醒?

9.发送文字、图片、文件的最大限制

10.发送内容为空或纯空格,是否支持发送?

11.发送内容包含敏感字眼时,是否被和谐?

12.@个人、多个、全部,是否有消息提示

13.消息中发送的网址,是否支持打开?

14.已经发送和接收的消息,是否支持复制或粘贴或转发?

15.已经发送的消息是否支持撤回,撤回时间有效性验证

16.频繁下拉上划刷新页面,页面是否正常

UI自动化测试和接口自动化测试

UI自动化测试:

1.用例维护量大
2.UI自动化测试在项目后期进行
3.适用于界面稳定的项目

接口自动化测试:

1.用例维护量相对少
2.在接口开发完之后就可以做(提前介入)
3.适合于接口稳定的项目

接口自动化测试投入产出比(效率)高于UI界面层的自动化测试

自动化适用的对象:周期比较长,项目比较稳定,需求不频繁变动的项目,产品型的项目

selenium工具

webdriver工作原理: 相当于出租车(驱动)
测试脚本—>乘客
webdriver—>司机
浏览器—>出租车

现在的selenium有增加了一些东西:一些浏览器的原生内核,Safari、edge、opera

selenium工作原理

1.测试脚本,可以是python,java编写的脚本程序(也可以叫做client端)

2.浏览器驱动, 这个驱动是根据不同的浏览器开发的,不同的浏览器使用不同的webdriver驱动程序且需要对应相应的浏览器版本,比如:geckodriver.exe(chrome)

3.浏览器,目前selenium支持市面上大多数浏览器,如:火狐,谷歌,IE等

WebDriver

如果你开始使用桌面网站或移动网站测试自动化,那么你将使用 webdriverapi。 Webdriver 使用浏览器厂商提供的浏览器自动化 api 来控制浏览器和运行测试。 这就好像是一个真正的用户在操作浏览器。 由于 WebDriver 不需要使用应用程序代码编译其 API,因此它不具有侵入性。 因此,您测试的应用程序与实时推送的应用程序相同。

IDE

Ide (集成开发环境)是您用来开发 Selenium 测试用例的工具。 它是一个易于使用的 Chrome 和 Firefox 扩展,并且通常是开发测试用例的最有效的方法。 它使用现有的 Selenium 命令记录用户在浏览器中的操作,参数由该元素的上下文定义。 这不仅是一个节省时间的方法,也是学习 Selenium 脚本语法的一个很好的方法。

Grid

Selenium Grid 允许您跨不同平台在不同的机器上运行测试用例。 触发测试用例的控制位于本地端,当触发测试用例时,它们将由远程端自动执行。

在 WebDriver 测试开发之后,您可能需要在多个浏览器和操作系统组合上运行测试。 这就是Grid出现的地方。

元素定位

1.id定位:find_element_by_id()
从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框

# coding = utf-8
from time import sleep
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过id定位搜索框,并输入selenium
driver.find_element_by_id('kw').send_keys('selenium')
# 等待5sleep(5)
# 退出
driver.quit() 

2.name定位:find_element_by_name()
从上面定位到的搜索框属性中,有个name="wd"的属性,我们可以通过这个name定位到这个搜索框

# coding = utf-8
from time import sleep
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过name定位搜索框,并输入selenium
driver.find_element_by_name('wd').send_keys('selenium')
# 等待5sleep(5)
# 退出
driver.quit()

3.class_name 定位:find_element_by_class_name()
从上面定位到的搜索框属性中,有个class="s_ipt"的属性,我们可以通过这个class定位到这个搜索框

# coding = utf-8
from time import sleep
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过class定位搜索框,并输入selenium
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
# 等待5sleep(5)
# 退出
driver.quit()

4.tag name定位:find_element_by_tag_name()
如果懂HTML知识,我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等…。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多div,input,a等tag,所以很难通过tag去区分不同的元素。基本上在我们工作中用不到这种定义方法,仅了解就行。下面代码仅做参考,运行时必定报错

# coding = utf-8
from time import sleep
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过tag定位搜索框,并输入selenium, 此处必报错
driver.find_element_by_tag_name('input').send_keys('selenium')
# 等待5sleep(5)
# 退出
driver.quit()

5.link定位:find_element_by_link_text()
此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“hao123”,“地图”等链接

# coding = utf-8
from time import sleep
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过link定位"新闻"这个链接并点击
driver.find_element_by_link_text('新闻').click()
# 等待5sleep(5)
# 退出
driver.quit()

6.partial_link定位:find_element_by_partial_link_text()
有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。

我们用这种方法来定位百度首页的“新闻”超链接

# coding = utf-8
from time import sleep
from selenium import webdriver

# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 通过partial_link定位"新闻"这个链接并点击
driver.find_element_by_partial_link_text('闻').click()
# 等待5sleep(5)
# 退出
driver.quit()

7.xpath定位:find_element_by_xpath()

前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。

但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。

8.CSS定位:find_element_by_css_selector()
这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,这里只做下简单的介绍。

CSS定位百度搜索框

性能测试

1.为什么要性能测试?
1)看软件是否能很快的响应用户的请求;
2)软件系统是否可以处理预期的负载并且有盈余能力;
3)软件是否可以处理预期的事物数量;
4)在预期和非预期的负载下,应用程序是否稳定;
5)在能够处理用户的请求下,用户有良好的体验;

2.性能测试关注什么?
1)响应时间=用户的反映时间+网络传输时间+系统服务器处理的时间+数据库服务器
2)每秒事务通过数
3)点击率:每秒向服务器发送的http请求的个数
4)吞吐量
5)系统运行占用的资源

3.性能测试的分类
1)并发测试
是指在一定的软件、硬件及网络环境下,通过运行一种或多种业务在不同虚拟用户数量情况下测试服务器的性能指标是否在用户的要求范围内,用于确定系统能承载的最大用户数、最大有效用户数以及不同用户数下的系统响应时间及服务器的资源利用率。

2)容量测试
是指一定的软件、硬件及网络环境下,例如向数据库中构造不同数量级别的数据记录,通过运行一种或多种业务在一定的虚拟用户数量情况下,获取不同数据级别的服务器性能指标,以确定数据库的最佳容量。

3)压力测试
在高于性能测试拐点的情形上,测试软件的表现形式。

4)可靠性测试
是指在一定的软件、硬件及网络环境下,通过模拟大量的虚拟用户向服务器产生负载,使服务器的资源处于极限状态下长时间连续运行,以测试服务器在高负载情况下是否能够稳定工作。

5)配置测试
是指在不同的软件、硬件、环境以及网络环境配置下,通过运行一种或多种业务在一定的虚拟用户数量情况次啊获得不同配置的性能指标,用于选择最佳的设备及参数配置。

一、unittest框架

unittest框架是基于UI界面层的单元功能测试框架(黑盒测试)
1)测试固件
setUp() 进行初始化
tearDown() 进行测试完后的清理工作
assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。

2)TestCase 测试用例
测试方法:test_

3)批量执行
把多个测试用例(可以是一个脚本中,也可以是多个脚本中)放到一个测试套件中去执行。

4)执行测试用例
TestRunner

5)生成测试报告
HTMLRunner

unittest.TestCase: TestCase类,所有测试用例类继承的基本类

class BaiduTest(unittest.TestCase):

unittest.main(): 使用它可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。

unittest.TestSuite(): unittest框架的TestSuite()类是用来创建测试套件的。

unittest.TextTextRunner(): unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。

unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:

discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

unittest.skip(): 装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。

测试套件

addTest()的应用
addTest 把一个脚本文件类中的测试用例一个一个添加进测试套件
unittest.makeSuite
unittest.TestLoader.loadTestsFromTestCase
以上两种方法都可以把一个脚本中所有的测试用例加入到一个测试套件中

def createsuite():
    suite = unittest.TestSuite()
    suite.addTest(testbaidu1.Baidu("test_hao"))
    suite.addTest(testbaidu1.Baidu("test_baidu"))
    return suite
if__name__=="__main__":
    suite = createsuite()
    runner = unittest.TextTestRunner(verbosity = 0)
    runner.run(suite)

verbosity:
0(静默模式):你只能获得总的测试用例数和总的结果比如总共100个失败,20成功80
1(默认模式):非常类似静默模式只是在每个成功的用例前面有个“.” 每个失败的用例前面有个“F”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
makesuit方法

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(testbaidu1.Baidu))

return suite 

二、使用unittest框架编写测试用例思路

# coding=utf-8
#1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

#2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2016-7-27
@author: Jennifer
Project:使用unittest框架编写测试用例思路
'''
#3.导入unittest模块
import unittest

#4.定义测试类,父类为unittest.TestCase。
#可继承unittest.TestCase的方法,如setUp和tearDown方法,不过此方法可以在子类重写,覆盖父类方法。
#可继承unittest.TestCase的各种断言方法。
class Test(unittest.TestCase): 
    
#5.定义setUp()方法用于测试用例执行前的初始化工作。
#注意,所有类中方法的入参为self,定义方法的变量也要“self.变量”
#注意,输入的值为字符型的需要转为int型
    def setUp(self):
        self.number=raw_input('Enter a number:')
        self.number=int(self.number)

#6.定义测试用例,以“test_”开头命名的方法
#注意,方法的入参为self
#可使用unittest.TestCase类下面的各种断言方法用于对测试结果的判断
#可定义多个测试用例
#最重要的就是该部分
    def test_case1(self):
        print self.number
        self.assertEqual(self.number,10,msg='Your input is not 10')
        
    def test_case2(self):
        print self.number
        self.assertEqual(self.number,20,msg='Your input is not 20')

    @unittest.skip('暂时跳过用例3的测试')
    def test_case3(self):
        print self.number
        self.assertEqual(self.number,30,msg='Your input is not 30')

#7.定义tearDown()方法用于测试用例执行之后的善后工作。
#注意,方法的入参为self
    def tearDown(self):
        print 'Test over'
        
#8如果直接运行该文件(__name__值为__main__),则执行以下语句,常用于测试脚本是否能够正常运行
if __name__=='__main__':
#8.1执行测试用例方案一如下:
#unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。
#执行顺序是命名顺序:先执行test_case1,再执行test_case2
    unittest.main()

python测试代码如下

import selenium import webdriver
import unittest
import time

class baidu(unittest.TestCase):
#     测试固件
    def setUp(self):
       self.driver = webdriver.Chrome()
       self.url = "http://www.baidu.com/"
       self.drivr.maximize_window()
       time.sleep(3)
    def tearDown(self):
      self.driver.quit()
#     测试用例
    def test_hao(self):
    driver = self.driver
    url = self.url
    driver.get(url)
    driver.find_element_by_link_text("hao123").click()
    time.sleep(6)

    def baidu(self):
    driver = self.driver
    url = self.url
    driver.get(url)
    driver.find_element_by_id("kw").send_keys("突如其来的假期")
    driver.find_element_by_id("su").submit()
    time.sleep(6)
#  执行入口
   if__name__=="__main__":
      unittest.main(verbosity=0)

百度搜索测试用例TestCase:

百度搜索测试用例Test Case:

复制代码

# coding=utf-8
'''
Created on 2016-7-22
@author: Jennifer
Project:登录百度测试用例
'''
from selenium import webdriver
import unittest, time

class BaiduTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30) #隐性等待时间为30秒
        self.base_url = "https://www.baidu.com"
    
    def test_baidu(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").clear()
        driver.find_element_by_id("kw").send_keys("unittest")
        driver.find_element_by_id("su").click()
        time.sleep(3)
        title=driver.title
        self.assertEqual(title, u"unittest_百度搜索") 

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()

HTML报告

#1.创建一个文件夹 
curpath = sys.path[0]
# sys.path是一个路径集合数组
print(sys.path)
print(sys.path[0])
#判断文件夹是否存在
if not os.path.exists(curpath+'/resultreport'):
os.makedirs(curpath+'resultreport')

#2.解决重复命的问题(用时间去命名)
now = time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
print(time.time())
print(time.loacltime(time.time()))

#文件名是路径加上文件的名称
filename = curpath + '/resultreport/'+ now +'resultreport.html'

# 打开HTML文件,wb以写的方式
with open(filename,'wb') as fp:

#括号里的参数是HTML 报告里面的参数
runner = HTMLTestRunner.HTMLTestRunner(stream = fp, title = u"测试报告",description = u"用例执行情况",verbosity=2)
suite = createsuite()
runner.run(suite)

三、数据驱动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值