一、引入unittest单元测试框架的好处有:

  • 提供用例组织与执行
  • 提供丰富的断言方法
  • 提供丰富的日志和报告(HTML格式的更好一些)

路径问题

在unittest中./表示首目录位置

  • TestCase:在unittest中的一个TestCase的实例就是一个测试用例,就是一个完整的测试流程,包括测试前资源初始化(setUp),执行测试代码(test),测试后环境的还原tearDown)。
  • TestSuite:测试套件,可以理解为:多个独立的测试用例(test case)可以构成一个测试套件,然后传递给TestRunner进行测试执行。
  • TestLoader:通过unittest.TestLoader类的loadTestsFromTestCase、loadTestsFromModule、LoadTestsFromName、discover方法,可以将测试用例添加一个测试套件中。
  • TestRunner :可以理解为测试集的运行器,可以在其基础上扩展子类
  • TextTestRunner或者HTMLTestRunner,只不过生成的测试报告样式不同。
  • TestResult:测试结果类,用来处理测试用例或测试集执行过程中的所有信息并最终输出,比如代码错误、异常、断言失败、skip等等。

二、Unittest.TestCase框架基本使用

  1. setUp():主要是进行测试用例的资源初始化,测试用例的前提条件写在这
  2. test_xxx():测试用例,要把测试用例的步骤写在这个方法中
  3. tearDown():主要是进行测试用例的资源释放的
    注册模块自动测试框架
    testc.py文件代码
#导包
import unittest
from selenium import webdriver
from time import sleep
import random
class zhucetest(unittest.TestCase):def setUp(self):#初始化资源self.driver =webdriver.Chrome()#谷歌浏览器打开self.driver.maximize_window()#最大化窗口self.driver.implicitly_wait(10)#智能等待时间self.driver.get("http://localhost:8088/verydows/index.php?c=user&a=register")#注册页面链接def testzhuce1(self):#test主体部分randN = str(random.randint(100,100000))#random随机变量的引入us = "cbt_"+randNuse =randN+"@163.com"self.driver.find_element_by_id("username").send_keys(us)self.driver.find_element_by_id("email").send_keys(use)self.driver.find_element_by_id("password").send_keys("123456")self.driver.find_element_by_id("repassword").send_keys("123456")self.driver.find_element_by_id("captcha").send_keys("aaaa")self.driver.find_element_by_link_text("立即注册").click()sleep(5)actualValue=self.driver.find_element_by_xpath('//*[@id="top-userbar"]/a').textexpectValue=usself.assertEqual(actualValue,expectValue,"设计用例失败")def testzhuce2(self):#下面插入列表list1=[['12345',"30215110100@qq.com",'123456','123456','用户名不符合格式要求'],['a123',"3021511200@qq.com",'123456','123456','用户名不符合格式要求'],['a113344556677838999',"302152100@qq.com",'123456','123456','用户名不符合格式要求'],['_abcda',"3021504200@qq.com",'123456','123456','用户名不符合格式要求'],['',"3021501500@qq.com",'123456','123456','请设置用户名']]for i in list1:self.driver.find_element_by_id("username").clear()self.driver.find_element_by_id("username").send_keys(i[0])self.driver.find_element_by_id("email").clear()self.driver.find_element_by_id("email").send_keys(i[1])self.driver.find_element_by_id("password").clear()self.driver.find_element_by_id("password").send_keys(i[2])self.driver.find_element_by_id("repassword").clear()self.driver.find_element_by_id("repassword").send_keys(i[3])self.driver.find_element_by_id("captcha").clear()self.driver.find_element_by_id("captcha").send_keys("aaaa")self.driver.find_element_by_link_text("立即注册").click()sleep(2)actualValue=self.driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[1]/dd/span/font').textexpectValue=i[4]self.assertEqual(actualValue,expectValue,"用例设计失败")
#或者用csv文件导入方式#需要把文件中的数据读入到脚本中来#with open(r"e:\verydows_Reg_false.csv","r",encoding="utf-8") as f:# data  = csv.reader(f)# 遍历data出来的数据就是一个个的列表for i in csv.reader(f):# 1、打开电商首页#driver.get("http://localhost:8088/verydows")nb# 2、点击免费注册driver.find_element_by_link_text("免费注册").click()# 3、输入合法的用户名#driver.find_element_by_id("username").send_keys(i[0])# 4、输入合法的邮箱#driver.find_element_by_id("email").send_keys(i[1])# 5、输入合法的密码#driver.find_element_by_id("password").send_keys(i[2])# 6、输入一致的确认密码3driver.find_element_by_id("repassword").send_keys(i[3])#driver.find_element_by_id("captcha").send_keys("aaaa")# 7、购选同意# 8、点击注册#driver.find_element_by_link_text("立即注册").click()#time.sleep(5)def testzhuce3(self):list2=[['te4st123945','@qq.com','123456','123456','无效的邮箱地址'],['terst4127345','302650102qq.com','123456','123456','无效的邮箱地址'],['tesrt1326345','302650100@.com','123456','123456','无效的邮箱地址'],['tesrt1822345','302650100@qq','123456','123456','无效的邮箱地址'],['testr1923145','','123456','123456','请设置邮箱']]for i in list2:self.driver.find_element_by_id("username").clear()self.driver.find_element_by_id("username").send_keys(i[0])self.driver.find_element_by_id("email").clear()self.driver.find_element_by_id("email").send_keys(i[1])self.driver.find_element_by_id("password").clear()self.driver.find_element_by_id("password").send_keys(i[2])self.driver.find_element_by_id("repassword").clear()self.driver.find_element_by_id("repassword").send_keys(i[3])self.driver.find_element_by_id("captcha").clear()self.driver.find_element_by_id("captcha").send_keys("aaaa")self.driver.find_element_by_link_text("立即注册").click()sleep(2)actualValue=self.driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[2]/dd/span/font').textexpectValue=i[4]self.assertEqual(actualValue,expectValue,"用例设计失败")def testzhuce4(self):list3=[['testaqb1233','3022650140@qq.com','12345','12345','密码不符合格式要求'],['testabg1223','3026501240@qq.com','1233333333333312341233333333333121223333333333333331232132322131231233','1233333333333312341233333333333121223333333333333331232132322131231233','密码不符合格式要求'],['testfab1213','3021650140@qq.com','','','请设置密码']]for i in list3:self.driver.find_element_by_id("username").clear()self.driver.find_element_by_id("username").send_keys(i[0])self.driver.find_element_by_id("email").clear()self.driver.find_element_by_id("email").send_keys(i[1])self.driver.find_element_by_id("password").clear()self.driver.find_element_by_id("password").send_keys(i[2])self.driver.find_element_by_id("repassword").clear()self.driver.find_element_by_id("repassword").send_keys(i[3])self.driver.find_element_by_id("captcha").clear()self.driver.find_element_by_id("captcha").send_keys("aaaa")self.driver.find_element_by_link_text("立即注册").click()sleep(2)actualValue=self.driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[3]/dd/span/font').textexpectValue=i[4]self.assertEqual(actualValue,expectValue,"用例设计失败")def testzhuce5(self):list4=[['teat123aa','3026520100@qq.com','123456','123457','两次密码不一致'],['teba123453','302650100@qq.com','123456','','两次密码不一致']]for i in list4:self.driver.find_element_by_id("username").clear()self.driver.find_element_by_id("username").send_keys(i[0])self.driver.find_element_by_id("email").clear()self.driver.find_element_by_id("email").send_keys(i[1])self.driver.find_element_by_id("password").clear()self.driver.find_element_by_id("password").send_keys(i[2])self.driver.find_element_by_id("repassword").clear()self.driver.find_element_by_id("repassword").send_keys(i[3])self.driver.find_element_by_id("captcha").clear()self.driver.find_element_by_id("captcha").send_keys("aaaa")self.driver.find_element_by_link_text("立即注册").click()sleep(2)actualValue=self.driver.find_element_by_xpath('//*[@id="register-form"]/div/dl[4]/dd/span/font').text#实际值expectValue=i[4]#预期值self.assertEqual(actualValue,expectValue,"用例设计失败")#做断言def tearDown(self):#资源释放self.driver.quit()
if __name__ == "__main__":unittest.main()#执行文件

通过addTest和addTests增加测试用例

if __name__=='__main__':suitt = unittest.TestSuite()#测试集合对象中有一个方法,addtest-->追加单个测试用例到测试集合#格式:类名(用例名)suitt.addTest(unitMymath("test_chengfa_2"))suitt.addTest(unitMymath("test_add_2"))suitt.addTest(unitMymath("test_add_1"))# 测试集合对象还有一个方法,addtests-->追加多个测试用例到测试集合suitt.addTests(map(unitMymath,["test_add_2","test_add_1"]))

三、TestRunner

  • TextTestRunner 语法:TextTestRunner(stream, descriptions=None, verbosity=0)
  • Stream:运行测试用例之后的结果要保存的文本文件流对象
  • Descriptions:对生成报告的描述性文字
  • Verbosity:日志显示等级
  • verbosity =< 0时—静默模式,输出结果中不提示执行成功的用例数
  • verbosity = 1 时—默认模式,输出结果中仅仅以(.)的形式表示执行成功的用例数,成功几个就是几个点
  • verbosity >= 2 时—详细模式,可以输出每个用例执行的详细信息,特别是在用例较多的情况下,此设置会比较有用
import unittest#导包
from HTMLTestRunner import HTMLTestRunner
discover=unittest.defaultTestLoader.discover(r"./SELENIUMTEST",pattern="testc*.py")                 #导入方法的路径和文件pattern=后跟要导入方法的模块,集合在一起
with open(r"./SELENIUMTEST/zhuce.html","wb")as f:#路径和生成新的.html文件runner=HTMLTestRunner(stream=f,verbosity=1,title="注册",description="测试")runner.run(discover)#运行导入用例生成报告文件

一个自动化测试用例,测试步骤、测试的断言缺一不可,unittest中提供的断言方法有:

  • assertEqual(a,b,msg=""):就是判断a和b是否相等,如果相等,则断言成功,如果不相等,会断言失败,并且输出msg消息
  • assertNotEqual(a,b,msg=""):就是判断a和b是否不相等
  • assertTrue(a):就是判断a是否为True这个bool值
  • assertFalse(a):就是判断a是否为False这个bool值
  • assertIs(a,b,msg=""):判断a和b的内存地址是否相等,如果相等则身份一致
  • assertIsNot(a,b,msg):判断a和b的内存地址是否不相等,如果相等,断言失败
  • assertIsNone(a):判断对象a是不是空指针(没有指向堆内存中空间),如果是则断言成功
  • assertIsNotNone(a):判断对象a是不是空指针,如果是,则断言失败
  • assertIn(a,b):判断a是不是b的成员,如果是则断言成功
  • assertNotIn((a,b):判断a是不是b的成员,如果不是则断言成功
  • assertIsInstance(a,b):判断a是b的一个实例对象
  • assertIsNotInstance(a,b):判断a不是b的一个实例对象

单元测试框架unittest和HtmlTestRunner报告相关推荐

  1. python单元测试框架—unittest

    目录 unittest核心工作原理 unittest示例 示例1:简单示例 示例2:setUpClass()和tearDownClass() 示例3:通过在测试用例方法名中添加数字test_N指定执行 ...

  2. python单元测试框架Unittest详解

    前言 我们今天来聊聊Python中的单元测试框架unittest,大家都知道在Python中比较热门的测试框架除了pytest就是unittest,我之前有讲过pytest所以今天想讲unittest ...

  3. Python 标准库之单元测试框架 -- unittest

    用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库--unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那 ...

  4. Python必会的单元测试框架 —— unittest

    用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库--unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那 ...

  5. 自动化测试(2-2):单元测试框架unittest

    unittest是python内嵌的测试框架,原名为PyUnit.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试 ...

  6. python单元测试框架unittest介绍和使用_Python+Selenium框架设计篇之-简单介绍unittest单元测试框架...

    前面文章已经简单介绍了一些关于自动化测试框架的介绍,知道了什么是自动化测试框架,主要有哪些特点,基本组成部分等.在继续介绍框架设计之前,我们先来学习一个工具,叫unittest. unittest是一 ...

  7. python写软件测试用例_Python单元测试框架unittest:单个测试用例编写步骤及实例...

    一.Python单元测试框架的编写步骤 导入模块 必须继承unittest.TestCase 主要是配置环境:进行测试前的初始化工作,比如在接口测试前面做一些前置的参数赋值,数据库操作等等 定义测试用 ...

  8. Python参数化框架parameterized+单元测试框架unittest HTMLReport nose

    Python参数化和单元测试框架使用 背景 思路 代码 运行 方法一 方法二 参考 背景 为了更好地管理自动化测试用例,同时对用例输入进行参数化,并且生成好看的测试报告,对题目中的几个框架进行了组合使 ...

  9. Python单元测试框架 unittest详解

    一 整体结构概览 unittest原名为PyUnit,是由java的JUnit衍生而来.对于单元测试,需要设置预先条件,对比预期结果和实际结果. TestCase :通过继承TestCase类,我们可 ...

最新文章

  1. POJ1328-Radar Installation
  2. 在sql server2000的查询分析器里查询oracle的数据
  3. 2008域控服务器创建本地用户,[转载](一)安装win2008r2、域控、IIS、证书服务器、部署exchang...
  4. [bzoj4922]Karp-de-Chant Number
  5. 初学python的小技巧_Python学习小技巧总结
  6. python鼠标碰撞_Python+opencv第5节鼠标响应事件,pythonopencv,第五节
  7. 金蝶kis云+sqlserver报表分析
  8. JDK动态代理入门、JDK动态代理原理、为什么JDK动态代理是基于接口的
  9. 单片机技术与c语言编程教学大纲,单片机原理及应用课程教学大纲
  10. 常用国家标准、行业标准、地方标准免费查阅网址,太实用了!
  11. IEEE Fellow、AAAS Fellow 同日公布,清华唐杰、京东郑宇等数十位华人入选
  12. vue中.lazy 相当于change事件
  13. ES6转化ES5方法(处理低版本手机白屏等兼容问题)
  14. 博客中Java开发的软硬件环境
  15. 白苹果修复_苹果手机突然屏幕变白怎么办
  16. echarts-特殊需求
  17. centos6 安装 nscd 清除DNS缓存
  18. 【Codeforces 777 D Cloud of Hashtags】
  19. 根据手机号查询归属地以及制式信息
  20. 随机森林对特征重要性排序

热门文章

  1. ABP WEBAPI 跨域问题
  2. 开课吧T31项目第14天
  3. 【带你学c带你飞】第2天课后练习
  4. gtd android 知乎,(知乎)律师的时间管理能力和GTD.pdf
  5. 基于STM32移植U8g2图形库——OLED显示(HAL库)
  6. python数字1 3怎么表示_Python3数据类型之数字
  7. IF选择结构例题(银行利率问题)
  8. Visual Studio 2022 的下载
  9. VMware的配置及ubuntu10.04 tftp 与嵌入式开发板的连接设置
  10. Unicode编码的实现