web端自动化测试框架之selenium4从入门到项目实战-3- unittest使用
1、unittest介绍
该unittest单元测试框架最初是由JUnit的启发,也有类似的味道在其他语言主要单元测试框架。它支持测试自动化、共享测试的设置和关闭代码、将测试聚合到集合中以及测试独立于报告框架。
test fixture
测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现。
A 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测试用例
所有测试用例的基类,它是软件 测试中最基本的组成单元。
A 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()方法将一个测试用例添加到测试套件中)
A 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
A 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使用相关推荐
- selenium web端自动化测试框架环境搭建
一.环境搭建 1.python安装selenium测试框架(也可以pycharm开发工具设置中对应的Python interpreter自动安装) 可以命令行安装 python -m pip inst ...
- Web端与App端自动化测试框架
Web端与App端自动化测试框架 一.Web端与App端的区别 想了解Web端与App端自动化测试框架的区别 ,那么我们就要先来了解Web和App的区别.Web项目一般都是B/S架构,基于浏览器的,而 ...
- selenium+Edge浏览器实现web端自动化测试
selenium+Edge浏览器的自动化测试 1. 概述 2. selenium自动化原理 (1)selenium3 (2)安装方式 3. 实战案例体验selenium自动化 4. 关于seleniu ...
- WEB UI自动化测试框架搭建(一)_公用方法Utils
本栏目内的所有项目使用的都是PyCharm 2020.1专业版,可以下载后自行在网上找教程破解. WEB UI自动化测试框架搭建(一)~(七)源代码:https://download.csdn.net ...
- Web UI 自动化测试框架 seldom
基于 selenium 和 unittest 的 Web UI自动化测试框架. 特点 提供更加简单API编写自动化测试. 提供脚手架,快速生成自动化测试项目. 自动生成HTML测试报告生成. 自带断言 ...
- 前端《Vue.js从入门到项目实战》PDF课件+《微信小程序实战入门第2版》PDF代码调试
JS进行开发,正如一切的编程语言都立足于电元信号的正负极,即01码,可为什么软件都不采用二进制编码来 进行开发呢?这里面牵扯到一个成本的问题,这正是影响项目领导者进行决策的关键因素.Vue项目与原生J ...
- Python3.5入门到项目实战(104天课程)
今天给大家分享一套详细的教程[Python3.5入门到项目实战(104天)],希望能够帮助到正在学Python的你,好了,话不多说,直接上资源: 资源目录 第01部分- 计算机与Linu基础(01-0 ...
- 【Golang 快速入门】项目实战:即时通信系统
Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...
- 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js
20年Nodejs教程零基础入门到项目实战前端视频教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务 ...
最新文章
- 3D Slicer实现纤维追踪(大脑纤维束成像)+核磁共振影像数据处理
- python小爬虫之天气查询
- OpenCV---图像金字塔原理
- burp和xray联动
- 待机、休眠、睡眠的区别和优缺点
- qt程序运行时绘图出现错误
- Python笔记-内置装饰器
- 时间模块(import time)
- STM32工作笔记0052---串口通信原理--UART
- php 显示探针_PHP探针
- 天猫行业资深店长认证
- Windows OCR推荐
- mybatis 标准输出日志报错: The setting logImpl is not known. Make sure you spelled it correctly (case sensit
- c语言求最大值 若有多个最大,二个随机变量的最大值与最小值分布的求法.pdf
- 使用 Levenshtein 寻找彼此相似的字符串对
- [操作系统]——进程与线程
- CVTE Java后台电话一面
- 说好的牛市来了,我的股票怎么跌停了?
- chrome 改变网页主题 设置黑色主题网页
- 小程序常用的页面布局