unittest框架
创始人
2024-02-01 21:04:00

unittest框架

  • 1.通过unittest框架创建测试
  • 2.通过unittest框架添加断言
  • 3.自动化用例管理TestLoader类的用法
  • 4.unittest智能封装等待

1.通过unittest框架创建测试

1.必须继承于unittest.TestCase类
2.可以定义setUp和tearDown方法进行初始化,每条测试用例开始或结束会执行。也可以使用setUpClass和tearDownClass来进行初始化,整个程序开始或结束会执行。
3.所有测试方法必须以test开头。测试方法会在运行时自动被调用。
4.可以pycharm自带的unittest框架运行,Run ‘Unittest for…’。也可以以普通方式运行。
在这里插入图片描述

  • setUp:每个测试方法执行前执行一次。
  • tearDown:每个测试方法结束后执行一次。
  • setUpClass:整个测试执行前执行一次。
  • tearDownClass: 整个测试执行后执行一次。

2.通过unittest框架添加断言

断言是为了判断实际结果与预期结果是否一致,任何测试都是需要断言的,否则就是操作,不能算自动化测试。在执行的过程中,断言失败了,就不会往下执行。
常见断言

  • assertIn
assertIn(key, container, message)
# key:在给定容器中检查其存在性的字符串
# container:在其中搜索关键字符串的字符串
# message:作为测试消息失败时显示的消息的字符串语句。可选项。

如果 key 包含在container字符串中,它将返回true,否则返回false,并提示message。

  • assertNotIn
  • assertEqual
assertEqual(firstValue, secondValue, message)
# firstValue按函数比较中使用的任何类型的变量
# secondValue:按函数比较时使用的任何类型的变量
# message:作为测试消息失败时显示的消息的字符串语句。
assertEqual(1, 1)

如果两个输入值相等,则assertEqual()将返回true,否则返回false。

  • assertNotEqual
  • assertTrue
assertTrue(testValue, message)
# testValue:布尔类型的变量,用于按功能比较
# message:作为测试消息失败时显示的消息的字符串语句。

如果测试值是true,则assertTrue()将返回true,否则返回false。

  • assertFalse

3.自动化用例管理TestLoader类的用法

测试用例有几百个,有时候只执行一部分,比如执行冒烟测试用例,回归测试用例,每次迭代的测试范围可能不一样。
TestLoader类常见方法

  • loadTestsFromTestCase()

smoketests.py 冒烟测试用例

import unittest
class SmokeTests(unittest.TestCase):  # 测试类必须继承unittest.TestCase类# 测试方法命名必须以test开头def testSk1(self):  # 测试用例1self.assertIn('hello', 'hell world')def testSk2(self):  # 测试用例2self.assertNotIn('hello', 'world')

requirementtests.py 需求测试用例

import unittest
class RequirementTests(unittest.TestCase):  # 测试类必须继承unittest.TestCase类# 测试方法命名必须以test开头def testRmt1(self):  # 测试用例1self.assertEqual(1, 1)def testRmt2(self):  # 测试用例2self.assertEqual(1, 1)

regressiontests.py 回归测试用例

import unittest
class RegressionTests(unittest.TestCase):  # 测试类必须继承unittest.TestCase类# 测试方法命名必须以test开头def testRg(self):  # 测试用例1self.assertIn(1, 1)def testRg(self):  # 测试用例2self.assertNotIn(1, 1)

performtests.py 执行用例

from smoketests import SmokeTests
from requirementtests import RequirementTests
from regressiontests import RegressionTests
import unittest
if __name__ == '__main__':sk = unittest.defaultTestLoader.loadTestsFromTestCase(SmokeTests) # 执行冒烟测试类里面的测试用例rq = unittest.defaultTestLoader.loadTestsFromTestCase(RequirementTests) # 执行需求测试类里面的测试用例rg = unittest.defaultTestLoader.loadTestsFromTestCase(RegressionTests) # 执行回归测试类里面的测试用例suite = unittest.TestSuite([sk])  # 执行一个测试类suite = unittest.TestSuite([sk, rq, rg])  # 执行冒烟,需求,回归测试unittest.TextTestRunner.run(suite)
  • loadTestsFromModule()
    从一个python文件里面导入测试方法
    performtests.py 执行用例
import smoketests, requirementtests, regressiontests 
import unittest
if __name__ == '__main__':names = [smoketests, requirementtests, regressiontests]  # 存放需要执行的测试类modules = []for item in names:module = unittest.defaultTestLoader.loadTestsFromModule(item)modules.append(module)suite = unittest.TestSuite(modules)  unittest.TextTestRunner.run(suite)
  • loadTestsFromNames()
    1)执行测试类里面的部分测试用例,意思是执行冒烟,需求,回归测试用例里面的几个测试用例
    performtests.py 执行用例
from smoketests import SmokeTests
from requirementtests import RequirementTests
from regressiontests import RegressionTests
import unittest
if __name__ == '__main__':names = ['smoketests.SmokeTests.testSk1', 'requirementtests.RequirementTests.testRmt1', 'regressiontests.RegressionTests.testRg1']  # 注意这里必须要从文件名.类名.方法写完整路径perform_test = unittest.defaultTestLoader.loadTestsFromNames(names)suite = unittest.TestSuite(perform_test) unittest.TextTestRunner.run(suite)

2)如果想执行某个功能模块,这个模块在冒烟测试用例中有一些用例。
smoketests.py 冒烟测试用例

import unittest
class SmokeTests(unittest.TestCase):  # 测试类必须继承unittest.TestCase类# 测试方法命名必须以test开头,同一个模块测试方法命名有相同的字段# 登录模块的测试用例def testLoginSk1(self):  # 测试用例1self.assertIn('hello', 'hell world1')def testLoginSk2(self):  # 测试用例2self.assertIn('hello', 'hell world2')def testLoginSk3(self):  # 测试用例3self.assertIn('hello', 'hell world3')# 注册模块的测试用例def testregistSk1(self):  # 测试用例4self.assertNotIn('hello', 'world')def testregistSk2(self):  # 测试用例5self.assertNotIn('hello', 'world')

performtests.py 执行用例

from smoketests import SmokeTests
import unittest
def getFullTestCaseNames(names):full_nams = []for item in names:if 'Login' in item:full_names.append('smoketests.SmokeTests.' + item)
if __name__ == '__main__':names = unittest.defaultTestLoader.getTestCaseNames(SmokeTests)perform_test = unittest.defaultTestLoader.loadTestsFromNames(getFullTestCaseNames(names))suite = unittest.TestSuite(perform_test) unittest.TextTestRunner.run(suite)
  • discover()

项目中最常用的方法,根据测试路径去选择执行哪些测试用例,冒烟,需求,回归测试用例用包分类存放用例
cases包 存放测试文件smoke包 ,requirement包,regression包
smoke包 存放冒烟测试用例的py文件
requirement包 存放冒烟测试用例的py文件
regression包 存放冒烟测试用例的py文件

performtests.py 执行用例

if __name__ == '__main__':case_dir = 'cases'  # cases包perform_test = unittest.defaultTestLoader.discover(case_dir + '/smoke', pattern='*.py')  # cases包下的smoke包下的所有py文件suite = unittest.TestSuite(perform_test) unittest.TextTestRunner.run(suite)

4.unittest智能封装等待

webdriver有强制等待,显示等待,隐式等待,详解见web自动化测试-等待

import unittest
from selenium import webdriver
from selenium.common.exceptions import NoSuchFrameException
from selenium.webdriver.support.wait import WebDriverWaitclass waitTest(unittest.TestCase):def setUp(self) -> None:self.driver = webdriver.Chrome()self.driver.get('')def tearDown(self) -> None:self.driver.quit()def find_element(self, locator):# 封装driver.find_element方法# locator参数是元素定位try:element = WebDriverWait(self.driver, 30 ,0.5).until(lambda x: x.find_element(*locator))return elementexcept NoSuchFrameException as e:print('Error details:{}'.format(e.args[0])) # e.args[0]指错误的原因def test1(self):  # 测试用例1,这里元素操作就可以不用等待self.find_element(('id', 'username')).send_keys('admin')self.find_element(('id', 'password')).send_keys('123456')self.find_element(('id', 'login')).click()self.find_element(('partial link text', '会议'))

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...