今天在给同学们上了自动化测试单元框架unittest之后,突发奇想,要总结下自己今天上的课程内容。于是有了下面的一幕:

  首先,今天上课的目标是要学会关于unittest框架的基本使用及断言、批量执行。

  第一个,unittest是什么:

  为了让单元测试代码能够被测试和维护人员更容易地理解,最好的解决办法是让开发人员遵循一定的规范来编写用于测试的代码,所以说unittest就随机缘而生,又因为用的人多了,所以逐渐的变成了python的单元测试标准。unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

  第二个,unittest类和方法的简介:

  (注:所有的测试用例需要使用test开头作为用例名称)

  unittest.TestCase:所有测试用例类必须继承TestCase类。

  TestCase.setUp():setUp()方法用于测试用例执行前的初始化工作。例如可以初始化driver对象,可以新建数据库访问对象,可以存放公共变量等。

  TestCase.tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭浏览器,关闭数据库连接等。

  TestCase.assert*():assert是一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。(常用的断言有:assertEqual,assertIs,assertIn等)

  unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。

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

  unittest.TestSuite():TestSuite()类是用来创建测试集的。

  unittest.TestSuite().addTest():addTest()方法是将测试用例添加到测试集合中。

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

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

  第三,进行代码unittest实践:

  具体实现代码如下:

  新建Test_baidu测试类:

import unittest
from selenium import webdriver class testBaidu1(unittest.TestCase):
# 添加setup进行初始化工作
def setUp(self):
self.driver = webdriver.Firefox() # 测试用例使用test开头
def testbaidu(self):
self.driver.get("http://www.baidu.com")
self.driver.find_element_by_id("kw").send_keys("selenium")
self.driver.find_element_by_id("su").click()
text = self.driver.find_element_by_xpath(".//*[@id='1']/h3/a").get_attribute("text")
print(text) # 断言判断文本是否存在于页面中
self.assertIn("Web Browser Automation",text) def testbaidu1(self):
self.driver.get("http://www.baidu.com")
self.driver.find_element_by_id("kw").send_keys("selenium")
self.driver.find_element_by_id("su").click()
text = self.driver.find_element_by_xpath(".//*[@id='1']/h3/a").get_attribute("text")
# 断言判断文本是否存在于页面中
self.assertIn("Web Browser Automation",text) # 添加teardown进行善后处理
def tearDown(self):
self.driver.quit() # 添加测试集合
suit = unittest.TestSuite()
suit.addTest(testBaidu1("testbaidu"))
suit.addTest(testBaidu1("testbaidu1")) if __name__ == '__main__':
# 使用main()方法进行运行用例
# unittest.main() # 使用 run放进行运行测试用例集
run = unittest.TextTestRunner()
run.run(suit)

  新建 run_all_case类:

  

import os
import unittest # 添加用例搜索目录
case_path = os.path.join(os.getcwd(),"case") def all_case():
# 使用discover进行自动搜索测试集
discover = unittest.defaultTestLoader.discover(case_path,
pattern="Test*.py",
top_level_dir=None
)
print(discover)
return discover if __name__ == '__main__':
# 使用run方法运行测试集
run = unittest.TextTestRunner()
run.run(all_case())

  最后,直接运行run_all_case进行自动化测试。

  

unittest培训后总结记录的更多相关文章

  1. ***CI中的数据库操作(insert_id新增后返回记录ID)

    在system/application/config 文件夹和里面的config文件里已经配置了参数 $active_group = "default";$db['default' ...

  2. 利用mysql中的SQL_CALC_FOUND_ROWS 来实现group by后的记录数统计

    最近正在做一个显示消息的列表页,列表页中需要根据一个字段来分组显示.并且需要一个分页的效果. 大家也知道group by 后的数据是每一组一行记录,统计分组后的总的记录数又不能用count,所以SQL ...

  3. Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】

    基本认识linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的. 问题场景 ...

  4. 【Linux】 多个会话同时执行命令后history记录不全的解决方案

    基本认识 linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的. 问题场 ...

  5. SQL(oracle) 取得分组后最大值记录

    方法一 select t1.a,t1.b,t1.c from test t1 inner join (seelct a,max(b) as b from test group by a) t2 on  ...

  6. 页面的div中有滚动条,js实现刷新页面后回到记录时滚动条的位置

    当div中绑定数据,给它一个属性overflow-y: scroll,添加长度大小,使其能够出现滚动条:每次刷新的时候滚动条总是会出现在最上方,这使我很头疼,经过查阅网上资料,返现两种方法可行.如下: ...

  7. 【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤

    问题描述 Azure Redis在使用的过程中,多次无规律的出现超时问题.抓取到客户端的异常错误后,想进一步的分析是何原因导致了如下异常呢? Timeout awaiting response (ou ...

  8. MongoDB非正常关闭后修复记录

    启动mongodb时出现如下错误: 根据提示可以知道错误原因是mongodb非正常关闭,此时需要对数据库进行修复.修复命令:mongod --repair 或 ./mongod --repair , ...

  9. JS实现刷新页面后回到记录时滚动条的位置

    window.onbeforeunload = function () { var scrollPos; if (typeof window.pageYOffset != 'undefined') { ...

随机推荐

  1. Vue根据条件添加 click 事件

    方式一:在绑定事件中直接添加标示量clickFlag <div @click="clickFlag && addGoodsHandler()"> XXX ...

  2. Matlab摄像头视频基本处理

    一.读取摄像头 1.首先保证摄像头及其驱动正确在电脑上安装 2.简单的代码显示驱动摄像头,并显示: vid = videoinput('winvideo',1); preview(vid); 3.默认 ...

  3. 如何编写高质量的C#代码(一)

    从"整洁代码"谈起 一千个读者,就有一千个哈姆雷特,代码质量也同样如此. 想必每一个对于代码有追求的开发者,对于"高质量"这个词,或多或少都有自己的一丝理解.当 ...

  4. C#知识点:ref和Out关键字浅谈

    首先我们要知道ref和out在C#里面是什么? 答:它们俩是C#里面的关键字. 他们俩是干啥的呢? 答:他们俩是方法参数的修饰符号,一但使用,方法定义和方法都用都要使用这个关键字,这一点是死规定. 好 ...

  5. 2020BJDCTF

    diff: 不得不说这种题目挺有意思的,现在记录一下阶梯过程: 先登录远程,发现有两个文件: 虽然直接能卡到flag文件,但是我们是以ctf用户登录的,并不能直接打开flag文件.仔细观察diff文件 ...

  6. python pickle库

    一.简介: 将文本信息转变为二进制数据流存储在一个文件中,便于下次使用. 二.常用函数: dump(object, file, protocol=None) 必填参数 obj 表示将要封装的对象 必填 ...

  7. python基础 画图

    python 画图 matplotlib 库只保存图片,不显示图片? 在导入库时,添加如下代码 import matplotlib matplotlib.use('Agg')  各种 symbol ? ...

  8. LongAccumulator类的BUG——reset方法并不能保证初始值正确赋值

    LongAccumulator.reset方法并不能重置重置LongAccumulator的identity:初始值正确,使其恢复原来的初始值.当初始值为0是不会发生这个问题,而当我们设置初始值如1时 ...

  9. 详解JVM中的内存模型是什么?

    强烈推荐 不管是找工作还是提升水平,都建议读一下<深入理解Java虚拟机>这本书,详细讲解了JVM中的内存管理.类加载过程.垃圾回收以及最重要的性能调优实战. 本博客也是参考了这本书,有不 ...

  10. spring boot+spring security集成以及Druid数据库连接池的问题

    贴工程目录,其中bll目录下是service+dao层,common是一些公用的模块及功能类,web是controller层 用到了druid及Redis,工具及配置类目录(本文不介绍如何配置drui ...