1、unittest介绍

该unittest单元测试框架最初是由JUnit的启发,也有类似的味道在其他语言主要单元测试框架。它支持测试自动化、共享测试的设置和关闭代码、将测试聚合到集合中以及测试独立于报告框架。

test fixture

测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现。

test fixture represents the preparation needed to perform one or more tests, and any associated cleanup actions. This may involve, for example, creating temporary or proxy databases, directories, or starting a server process.

test case测试用例

所有测试用例的基类,它是软件 测试中最基本的组成单元。

test case is the individual unit of testing. It checks for a specific response to a particular set of inputs. unittest provides a base class, TestCase, which may be used to create new test cases.

test suite测试套件

多个测试用例test case集合就是TestSuite,常用addTest()方法将一个测试用例添加到测试套件中(对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中)

test suite is a collection of test cases, test suites, or both. It is used to aggregate tests that should be executed together.

test runner

test runner is a component which orchestrates the execution of tests and provides the outcome to the user. The runner may use a graphical interface, a textual interface, or return a special value to indicate the results of executing the tests.

该模块包括许多的类如 test case类、test suit类、texttest runner类、texttest resuite类、test loader类test case类的话一个test case 就是一个测试用例,一个测试用例包含一个完成的流程,包括setup()表示初始化用例,run()表示运行,teardown表示还原测试场景。Test suit类在自动化中往往一个场景需要编写一个或者多个测试用例,那么就需要把这些多个用例一起执行,这时候需要把用例收集起来,就可以通过testsuite来处理,可以把testsulte当成一个用例容器,而在testsuite中就有一个addtest方法可以将用例添加到这个容器里面形成一个套件。Texttextrunner类该类是用来执行用例的,其中包含一个run()方法,该方法不但可以运行单个用例,也可以运行testsuite中的多个用例,并将执行结果保存到texttestresult里。Testloader类,该类帮我们搜索所有test开头的测试用例并将搜索到的方法用testsuite收集起来所以使用unittest框架编写测试用例的时候用例命名需要用test打头。Unittest框架结构分为三部分,首先是setup部分用于设计初始化环境的,该类中方法执行的时候都会先执行setup中的代码。运行部分:这里是编写测试用例的地方所有的用例命名都需要用test开头最后是teatdown部分:这里是用例执行完后还原测试环境的。

unittest框架原理:一个py文件里面有多个测试用例(testcase),通过testloader方法或者addtest方法加入到testsuit套件容器中。然后通过texttestrunner方法来执行测试用例,执行后然后,生成的测试结果自动保存在texttestresult中

框架中用例执行顺序:setUp()-----testcase-----teardown()

注:以上来源于网络


2、前置条件与后置条件

setup:前置条件,每个用例执行前都会执行该方法

teardown:后置条件,每个用例执行后都会执行该方法

注意:每个测试用例要以test开头。

import unittest
class FirstCase01(unittest.TestCase):def setUp(self) -> None:print("这是case的前置条件")def testfirst01(self):print("这是第一个case")def testfirst02(self):print("这是第二个case")def tearDown(self) -> None:print("这是case的后置条件")
if __name__ == '__main__':unittest.main()-------
这是case的前置条件
这是第一个case
这是case的后置条件
这是case的前置条件
这是第二个case
这是case的后置条件

3、unittest和PO模型结合梳理执行所有case

将启动浏览器、窗口最大化等放在setup

将关闭浏览器放在teardown

setUpClass所有用例前执行

tearDownClass所有用例后执行

# -*- coding: utf-8 -*-
# @Time : 2021/12/27 8:16
# @Author : jeffky
# @File : first_case.py
from business.register_business import RegisterBusiness
from selenium import webdriver
import unittest
class FirstCase(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:'''所有用例前执行:return:'''print("所有用例执行之前的前置")@classmethoddef tearDownClass(cls) -> None:'''所有用例后执行:return:'''print("所有用例执行之后的前置")'''用例层'''def setUp(self) -> None:self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.get('http://www.5itest.cn/register')self.register=RegisterBusiness(self.driver)def tearDown(self) -> None:self.driver.close()def test_login_email_error(self):email_error = self.register.register_email_error('34','111','111111','test1')if email_error ==True:print("注册成功了,此条case执行失败")def test_login_username_error(self):username_error = self.register.register_name_error('34@qq.com','11','111111','test1')if username_error ==True:print("注册成功了,此条case执行失败")def test_login_password_error(self):password_error = self.register.register_password_error('34@qq.com','11','11','test1')if password_error ==True:print("注册成功了,此条case执行失败")def test_login_code_error(self):code_error = self.register.register_code_error('34@qq.com','111','111111','test1')if code_error ==True:print("注册成功了,此条case执行失败")def test_login_success(self):success = self.register.user_base('34@qq.com','111','111111','test1')if self.register.register_succes()==True:print("注册成功了,此条case执行失败")
# def main():
#     first = FirstCase()
#     first.test_login_email_error()
#     first.test_login_code_error()
#     first.test_login_username_error()
#     first.test_login_password_error()
#     first.test_login_success()
if __name__ == '__main__':# main()unittest.main()

4、unittest容器

# -*- coding: utf-8 -*-
# @Time : 2021/12/29 7:55
# @Author : jeffky
# @File : unittest_case.py
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
import unittestclass FirstCase01(unittest.TestCase):def setUp(self) -> None:print("这是case的前置条件")def testfirst01(self):print("这是第一个case")def testfirst02(self):print("这是第二个case")def tearDown(self) -> None:print("这是case的后置条件")
if __name__ == '__main__':# unittest.main()#1、创建容器suite = unittest.TestSuite()#将需要测试的用例加入至容器suite.addTest(FirstCase01('testfirst02'))#执行容器内的用例unittest.TextTestRunner().run(suite)

注意:当使用该方法在pycharm执行时,依旧会显示两个用例,这是由于pycharm 执行机制导致的,想看效果要,使用控制台执行才能看到

5、unittest用例执行顺序及case跳过

默认执行顺序

通过案例可以发现默认顺序为名字字母数字升序执行

通过容器内添加顺序进行执行

case跳过

增加注解@unittest.skip("不执行该用例")

6、大批量运行case文件

# @File : run_case.py
import unittest
import os
class RunCase(unittest.TestCase):def test_case01(self):case_path = os.path.join(os.getcwd(),'case')suite = unittest.defaultTestLoader.discover(case_path,"unittest_*.py")unittest.TextTestRunner().run(suite)
if __name__ == '__main__':unittest.main()

7、断言assert

# @File : first_case.py
from business.register_business import RegisterBusiness
from selenium import webdriver
import unittestclass FirstCase(unittest.TestCase):'''用例层'''@classmethoddef setUpClass(cls) -> None:'''所有用例前执行:return:'''print("所有用例执行之前的前置")@classmethoddef tearDownClass(cls) -> None:'''所有用例后执行:return:'''print("所有用例执行之后的前置")def setUp(self) -> None:self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.get('http://www.5itest.cn/register')self.register=RegisterBusiness(self.driver)def tearDown(self) -> None:self.driver.close()def test_login_email_error(self):email_error = self.register.register_email_error('34','111','111111','test1')self.assertFalse(email_error)# if email_error ==True:#     print("注册成功了,此条case执行失败")def test_login_username_error(self):username_error = self.register.register_name_error('34@qq.com','11','111111','test1')self.assertFalse(username_error)# if username_error ==True:#     print("注册成功了,此条case执行失败")def test_login_password_error(self):password_error = self.register.register_password_error('34@qq.com','11','11','test1')self.assertFalse(password_error)# if password_error ==True:#     print("注册成功了,此条case执行失败")def test_login_code_error(self):code_error = self.register.register_code_error('34@qq.com','111','111111','test1')self.assertFalse(code_error)# if code_error ==True:#     print("注册成功了,此条case执行失败")def test_login_success(self):success = self.register.user_base('34@qq.com','111','111111','test1')self.assertFalse(success)# if self.register.register_succes()==True:#     print("注册成功了,此条case执行失败")
# def main():
#     first = FirstCase()
#     first.test_login_email_error()
#     first.test_login_code_error()
#     first.test_login_username_error()
#     first.test_login_password_error()
#     first.test_login_success()
if __name__ == '__main__':# main()unittest.main()

8、生成测试报告

# -*- coding: utf-8 -*-
# @Time : 2021/12/27 8:16
# @Author : jeffky
# @File : first_case.py
import os
import sys
sys.path.append('E:\\2021code\\Jeff_selenium_po_test')
from business.register_business import RegisterBusiness
from selenium import webdriver
import unittest
from util import HTMLTestRunner
class FirstCase(unittest.TestCase):'''用例层'''@classmethoddef setUpClass(cls) -> None:'''所有用例前执行:return:'''print("所有用例执行之前的前置")@classmethoddef tearDownClass(cls) -> None:'''所有用例后执行:return:'''print("所有用例执行之后的前置")def setUp(self) -> None:self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.get('http://www.5itest.cn/register')self.register=RegisterBusiness(self.driver)def tearDown(self) -> None:self.driver.close()def test_login_email_error(self):email_error = self.register.register_email_error('34','111','111111','test1')self.assertFalse(email_error)# if email_error ==True:#     print("注册成功了,此条case执行失败")def test_login_username_error(self):username_error = self.register.register_name_error('34@qq.com','11','111111','test1')self.assertFalse(username_error)# if username_error ==True:#     print("注册成功了,此条case执行失败")def test_login_password_error(self):password_error = self.register.register_password_error('34@qq.com','11','11','test1')self.assertFalse(password_error)# if password_error ==True:#     print("注册成功了,此条case执行失败")def test_login_code_error(self):code_error = self.register.register_code_error('34@qq.com','111','111111','test1')self.assertFalse(code_error)# if code_error ==True:#     print("注册成功了,此条case执行失败")def test_login_success(self):success = self.register.user_base('34@qq.com','111','111111','test1')self.assertFalse(success)# if self.register.register_succes()==True:#     print("注册成功了,此条case执行失败")
# def main():
#     first = FirstCase()
#     first.test_login_email_error()
#     first.test_login_code_error()
#     first.test_login_username_error()
#     first.test_login_password_error()
#     first.test_login_success()
if __name__ == '__main__':# main()#os.path.abspath(os.path.dirname(os.getcwd()))获取上一级目录file_path = os.path.join(os.path.abspath(os.path.dirname(os.getcwd()))+os.sep+'report'+os.sep+'first_case.html')f = open(file_path,'wb')suite = unittest.TestSuite()suite.addTest(FirstCase('test_login_success'))runner = HTMLTestRunner.HTMLTestRunner(stream=f,title="this is first report",description="这个是我们第一次测试报告",verbosity=2)runner.run(suite)# unittest.main()

9、 项目中case运行失败截图low方法设计与封装

当元素找不到时执行截图操作

(LOW方法)

image_path = os.path.join(os.path.abspath(os.path.dirname(os.getcwd()))+os.sep+'image')
class FindElement(object):def __init__(self,driver):self.driver = driverdef get_element(self,key):read_ini = ReadIni()data = read_ini.get_value(key)by = data.split('>')[0]value = data.split('>')[1]try:element = self.driver.find_element(locator[by], value)return elementexcept:self.driver.save_screenshot(image_path+os.sep+value+'.png')return None

封装失败自动截图方法

修改File : first_case.py

将截图放置在teardown方法中

    def tearDown(self) -> None:time.sleep(2)# sys.exc_info()[0]#捕获程序是否有异常# if sys.exc_info()[0]:#     self._outcomefor method_name,error in self._outcome.errors:if error:case_name = self._testMethodNameself.driver.save_screenshot(image_path+os.sep+case_name+'.png')print(image_path+os.sep+case_name+str_datatime+'.png')

web端自动化测试框架之selenium4从入门到项目实战-3- unittest使用相关推荐

  1. selenium web端自动化测试框架环境搭建

    一.环境搭建 1.python安装selenium测试框架(也可以pycharm开发工具设置中对应的Python interpreter自动安装) 可以命令行安装 python -m pip inst ...

  2. Web端与App端自动化测试框架

    Web端与App端自动化测试框架 一.Web端与App端的区别 想了解Web端与App端自动化测试框架的区别 ,那么我们就要先来了解Web和App的区别.Web项目一般都是B/S架构,基于浏览器的,而 ...

  3. selenium+Edge浏览器实现web端自动化测试

    selenium+Edge浏览器的自动化测试 1. 概述 2. selenium自动化原理 (1)selenium3 (2)安装方式 3. 实战案例体验selenium自动化 4. 关于seleniu ...

  4. WEB UI自动化测试框架搭建(一)_公用方法Utils

    本栏目内的所有项目使用的都是PyCharm 2020.1专业版,可以下载后自行在网上找教程破解. WEB UI自动化测试框架搭建(一)~(七)源代码:https://download.csdn.net ...

  5. Web UI 自动化测试框架 seldom

    基于 selenium 和 unittest 的 Web UI自动化测试框架. 特点 提供更加简单API编写自动化测试. 提供脚手架,快速生成自动化测试项目. 自动生成HTML测试报告生成. 自带断言 ...

  6. 前端《Vue.js从入门到项目实战》PDF课件+《微信小程序实战入门第2版》PDF代码调试

    JS进行开发,正如一切的编程语言都立足于电元信号的正负极,即01码,可为什么软件都不采用二进制编码来 进行开发呢?这里面牵扯到一个成本的问题,这正是影响项目领导者进行决策的关键因素.Vue项目与原生J ...

  7. Python3.5入门到项目实战(104天课程)

    今天给大家分享一套详细的教程[Python3.5入门到项目实战(104天)],希望能够帮助到正在学Python的你,好了,话不多说,直接上资源: 资源目录 第01部分- 计算机与Linu基础(01-0 ...

  8. 【Golang 快速入门】项目实战:即时通信系统

    Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...

  9. 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js

    20年Nodejs教程零基础入门到项目实战前端视频教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务 ...

最新文章

  1. 3D Slicer实现纤维追踪(大脑纤维束成像)+核磁共振影像数据处理
  2. python小爬虫之天气查询
  3. OpenCV---图像金字塔原理
  4. burp和xray联动
  5. 待机、休眠、睡眠的区别和优缺点
  6. qt程序运行时绘图出现错误
  7. Python笔记-内置装饰器
  8. 时间模块(import time)
  9. STM32工作笔记0052---串口通信原理--UART
  10. php 显示探针_PHP探针
  11. 天猫行业资深店长认证
  12. Windows OCR推荐
  13. mybatis 标准输出日志报错: The setting logImpl is not known. Make sure you spelled it correctly (case sensit
  14. c语言求最大值 若有多个最大,二个随机变量的最大值与最小值分布的求法.pdf
  15. 使用 Levenshtein 寻找彼此相似的字符串对
  16. [操作系统]——进程与线程
  17. CVTE Java后台电话一面
  18. 说好的牛市来了,我的股票怎么跌停了?
  19. chrome 改变网页主题 设置黑色主题网页
  20. 小程序常用的页面布局

热门文章

  1. 【泡泡机器人公开课】公开课链接 机器人俱乐部
  2. 项目07城市餐饮店铺选址分析
  3. 2018年——幻灭 2019年——重启
  4. HT合泰单片机入门教程(第七章 LCD)
  5. C# 操作现有Word表格详细教程
  6. 关于基础微积分的结束语
  7. WITH GRANT OPTION的作用
  8. 孙陶然:企业必须与社会分享
  9. 我的理想计算机作文300字,我的理想作文300字(精选12篇)
  10. Intel汇编-JMP无条件调转