学习笔记-unittest

笔记目录:https://blog.csdn.net/weixin_42717928/article/details/114343085

昨天下了雨,今天刮了风,明天太阳就出来了

  • 简介
  • 概念
  • 断言
  • 其他相关
  • web自动化小案例

一:简介

单元测试适合白盒或者开发人员做。

单元测试框架可以用来写测试用例,也适合做Web自动化测试、App自动化测试、接口自动化测试等。

Python中有doctest、unittest、pytest、nose等单元测试框架。

(1)什么是单元测试

本质是通过一段代码去验证另一段代码,所以不要单元测试框架也可以写单元测试。

class Calculation:"""  完成加法计算 """def __init__(self, a, b):self.a = int(a)self.b = int(b)# 加法def add(self):return self.a + self.b
from test.test2 import Calculation# 测试加法
def test_add():c = Calculation(1, 1)rs = c.add()# 这里我特意断言失败assert rs == 3, '加法执行错误'if __name__ == '__main__':test_add()

但这种方法有问题:1是要自己定义失败的提示,2是如果某个测试函数执行失败,后面的测试函数不再执行,3是无法统计结果(编写更多代码可以解决,但偏离测试的初衷)

使用unittest编写测试用例:

import unittest
from test.test2 import Calculationclass TestCalculation(unittest.TestCase):def test_add(self):c = Calculation(1, 1)rs = c.add()self.assertEqual(rs, 3)if __name__ == '__main__':unittest.main()

这里有个坑,就是比如我想使用unittest运行单个用例,鼠标在方法名右键执行就行,运行整个的,就在main那里右键执行。(这种方式运行是如python tests那样,因为使用了unittest,默认是使用这种方式运行)

但是这种方式是没有测试报告的,必须这样(如果不知道路径,搞个简单的输出文件复制一下就行)

这样输出就有对应的结果了(也可以吧python tests的删除了,鼠标在main后,就能看到test的run了)

这里结果的含义:

  • .:表示通过
  • E:表示运行错误
  • s:表示运行跳过
  • F:表示运行失败

二:概念

Test Case:最小的测试单元,Unittest提供了TestCase用于创建测试用例

Test Suite:测试套件,用于组装一组要运行的测试,Unittest提供了TestSuite用于创建测试套件

Test Runner:用于协调测试的执行并向用户提供结果,Unittest提供了TextTestRunner用于运行测试用例,提供HTMLTestRunner用于生成HTML测试报告

Test Fixture:代表执行一个或多个测试所需的环境准备,以及关联的清理动作。如setUp、tearDown

import unittest
from test.test2 import Calculation# 必须继承unittest模块的TestCase类
class TestCalculation(unittest.TestCase):# 测试用例前置动作def setUp(self):print("测试开始")# 测试用例后置动作def tearDown(self):print("测试结束")# 测试方法以test开头def test_add(self):print("第一条测试用例")c = Calculation(1, 1)rs = c.add()# 由于继承了TestCase类,可以通过self直接调用断言方法self.assertEqual(rs, 3)def test_sub(self):print("第二条测试用例")c = Calculation(1, 1)rs = c.sub()# 由于继承了TestCase类,可以通过self直接调用断言方法self.assertEqual(rs, 0)if __name__ == '__main__':# 抛弃了这个方法# unittest.main()# 创建测试套件suit = unittest.TestSuite()suit.addTest(TestCalculation("test_add"))suit.addTest(TestCalculation("test_sub"))# 创建测试运行器runner = unittest.TextTestRunner()runner.run(suit)

好处是可以控制执行顺序,还有需要运行的用例。

三:断言

方法

检查

版本

assertEqual(a,b)

a==b

assertNotEqual(a,b)

a!=b

assertTrue(x)

bool(x) is True

assertFalse(x)

bool(x) is False

assertIs(a,b)

a is b

3.1

assertIsNot(a,b)

a is not b

3.1

assertIsNone(x)

x is None

3.1

assertIsNotNone(x)

x is not None

3.1

assertIn(a,b)

a in b

3.1

assertNotIn(a,b)

a not in b

3.1

assertIsInstance(a,b)

Isinstance(a,b)

3.1

assertNotIsInstance(a,b)

Not Isinstance(a,b)

3.1

可以通过这种方式推出断言的使用:

import unittestclass TestAssert(unittest.TestCase):def test_equal(self):self.assertEqual(1+1, 2)if __name__ == '__main__':unittest.main()

四:其他相关

(1)一个测试类对应一个被测试功能,如加法类,里面有很多方法,如整数相加、小数相加等

格式:

unittest中的TestLoader类提供了discover()方法可以从多个文件中查找测试用例,

不需要创建该类实例,unittest提供了可共享的defaultTestLoader类,可以使用其子类或方法创建实例,再调用discover方法

import unittest# 测试用例目录
test_dir = './test'
# 测试用例目录、匹配以test开头的多个文件、还有一个参数是top_level_dir=None:测试模块的顶层目录,若没有则默认是None
suits = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')if __name__ == '__main__':runner = unittest.TextTestRunner()runner.run(suits)

(2)测试用例的执行顺序

测试用例的执行顺序涉及多个层级:多个测试目录>多个测试文件>多个测试类>多个测试方法(测试用例)

unittest默认根据ASCII码的顺序加载测试用例(0~9,A~Z,a~z),这是main()方法执行的规律

discover()方法和main()一样,对于测试目录、测试文件同样适用

也可以通过测试套件TestSuite类的addTest()方法按照顺序来加载执行

(3)执行多级目录的测试用例

多个目录,如果discover()方法中的start_dir参数定义为“./test”目录,为了能查到更下层的目录,可以在每个子目录放一个__init__.py文件。作用是将一个目录记为一个标准的python模块。

(4)跳过测试和预期失败

不仅仅可以作用于方法,类也可以,下面是作用于方法

import unittestclass MyTest(unittest.TestCase):# 无条件跳过,需要说明跳过测试的原因@unittest.skip("直接跳过测试")def test_skip(self):print("1")@unittest.skipIf(2 > 1, "条件为真时跳过测试")def test_skip_if(self):print("2")@unittest.skipUnless(2 > 1, "条件为真时执行")def test_skip_unless(self):print("3")# 不管执行结果是否失败,都将测试标为失败,但不会抛出失败信息(这里我看结果的符号是u)@unittest.expectedFailuredef test_expected_failure(self):print("4")if __name__ == '__main__':unittest.main()

(5)Fixture

夹心饼干的饼干,setIp和tearDown,还有更大范围的,如测试类和模块的fIxture

import unittest# setUpModule和tearDownModule在整个模块的开始与结束执行
def setUpModule():print("1")def tearDownModule():print("1-end")class MyTest(unittest.TestCase):# setUpClass和tearDownClass在测试类的开始和结束执行# 都是类方法,使用classmethod装饰,cls可以理解为和self一样的表示第一个参数的意思@classmethoddef setUpClass(cls):print("2")@classmethoddef tearDownClass(cls):print("2-end")# setUp和tearDown在测试用例的开始和结束执行,所以先2-测试1-2-end,再2-测试2-2-enddef setUp(self):print("3")def tearDown(self):print("3-end")def test_case1(self):print("测试1")def test_case2(self):print("测试2")if __name__ == '__main__':unittest.main()

五:web自动化小案例

import unittest
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import Byclass TestBaiDu(unittest.TestCase):# 使用这个比setUp好,不用每执行一次用例就重启和关闭一次浏览器,提高效率@classmethoddef setUpClass(cls):cls.driver = webdriver.Chrome()cls.test_url = "https://www.baidu.com"# 封装重复代码(不是test开头,不会当成用例去执行)def baidu_search(self, search_key):self.driver.get(self.test_url)self.driver.find_element(By.ID, "kw").send_keys(search_key)self.driver.find_element(By.ID, "su").click()sleep(2)# 用例1def test_search_haha(self):search_key = "haha"self.baidu_search(search_key)title = self.driver.titleself.assertEqual(title, search_key+"_百度搜索")# 用例2def test_search_hehe(self):search_key = "hehe"self.baidu_search(search_key)title = self.driver.titleself.assertEqual(title, search_key+"_百度搜索")@classmethoddef tearDownClass(cls):cls.driver.quit()if __name__ == '__main__':unittest.main()

unittest学习(一)相关推荐

  1. unittest学习记录

    unittest学习主要有两点,一是怎么使用unittest,二是学习其源码.这两点就好比即使不知道gcc是怎么实现的,我们也能用c语言写出软件来.哪怕我们不清楚unittest是怎么实现的,我们也可 ...

  2. python test suit_python unittest学习3---添加测试套件,testsuit

    一下例子即把testcase添加到suit里面 import unittest class TestStringMethods(unittest.TestCase): def test_upper(s ...

  3. 【unittest学习】unittest框架主要功能

    1.认识unittest 在 Python 中有诸多单元测试框架,如 doctest.unittest.pytest.nose 等,Python 2.1 及 其以后的版本已经将 unittest 作为 ...

  4. 零基础如何学习自动化测试

    现在很多测试人员有些急于求成,没有任何基础想当然的,要在一周内上手自动化测试. 在自动化的过程中时候总有人会犯很低级的问题,有语法问题,有定位问题,而且有人居然连__init__.py 文件名都弄错误 ...

  5. 0基础如何学习自动化测试?按照这7步一步一步来学习就成功了

    现在很多测试人员有些急于求成,没有任何基础想当然的,要在一周内上手自动化测试. 在自动化的过程中时候总有人会犯很低级的问题,有语法问题,有定位问题,而且有人居然连__init__.py 文件名都弄错误 ...

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

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

  7. IOS Unit test

    转自:http://blog.csdn.net/jymn_chen/article/details/21552941 断言测试 下面一共18个断言(SDK中也是18个,其含义转自ios UnitTes ...

  8. 初探iOS单元测试XCTest

    测试基本流程 添加单元测试 创建项目时勾选Inclue Unit Tests . 忘了勾选可通过创建File–>new–>target–>iOS–>iOS Unit Testi ...

  9. Python接口自动化测试自学路线

    最近毕业季,毕业生找我很多,问我测试怎么学,接口自动化怎么做,我整理了接口自动化学习路线图,希望对你有用. 接口自动化要求具备编码的能力,而在市场上并没有可供学习的系统路线,且很非计算机专业的同学想转 ...

最新文章

  1. 进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)
  2. php+json对象格式,PHP 创建对象来输出 JSON 格式
  3. jdbc连接mysql视频_jdbc连接mysql数据库视频
  4. Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记
  5. JSON中的JSON.parseArray()方法、JSON.parseObject()方法和JSON.tojsonString()方法
  6. 与计算机病毒相关的小故事,我和计算机病毒的故事2000字论文
  7. 单链表实现一元多项式相加_python面试系列 01如何实现单链表的逆序
  8. web响应式图片设计实现
  9. c语言位运算符怎么用,傻傻分不清
  10. 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。...
  11. Message Unable to connect to SQL Server '(local)'
  12. win7点e出现计算机,Win7电脑蓝屏显示代码0x0000007e的解决方法
  13. 913_emacs中使用restart-emacs
  14. 一气呵成:用Compose完美复刻Flappy Bird!
  15. 立创EDA---PCB
  16. quartz简单入门
  17. I/O error on POST request for “http://localhost:9411/api/v2/spans“
  18. Android studio里packagename和applicationId
  19. Hexo-NexT主题中文目录不跳转的解决方法
  20. 为什么处理一个排好序的数组比未排序的数组要快?

热门文章

  1. 2019风中劲草 思想政治理论冲刺背诵核心考点【超清】
  2. ROS机器人技术课程大作业,机器人基础实例
  3. 第一本人工智能教材入驻高中课堂,程序员们要加油了
  4. tools :cflow
  5. 使用AVAsset转换音频格式
  6. CorelDRAW如何用新增功能工艺部分
  7. STM32H750 QSPI FLASH使用小结
  8. Softcam虚拟摄像机下载破解和使用
  9. windows mobile中区分cmwap或cmnet接入点
  10. 编程学习 | C语言结构组成