当前位置: 首页 > news >正文

软件测试基础十七(python Unittest)

Unittest

一、Unittest 简介

unittest是 Python 内置的标准测试框架,用于编写和运行单元测试。它提供了一组工具和类,帮助开发者组织、编写和执行测试用例,以验证代码的正确性。

二、Unittest 核心要素

1. TestCase(测试用例类)

  1. 定义与作用:
    • TestCaseunittest框架中最小的测试单元,用于封装一个具体的测试场景。它通常是一个继承自unittest.TestCase的类,每个类中的方法代表一个具体的测试用例。
    • 测试用例应该是独立的、可重复执行的,并且能够验证被测试代码的特定功能或行为。
  1. 主要方法:

例如:

import unittestclass TestCase(unittest.TestCase):def setUp(self):self.num = 5def tearDown(self):del self.numdef test_equal(self):self.assertEqual(self.num, 5)if __name__ == '__main__':unittest.main()
    • setUp():在每个测试方法执行之前被调用,用于设置测试环境,例如初始化对象、创建临时文件等。
    • tearDown():在每个测试方法执行之后被调用,用于清理测试环境,例如删除临时文件、释放资源等。
    • 测试方法:以“test_”开头的方法被视为测试方法,这些方法中包含具体的测试逻辑和断言,用于验证被测试代码的输出是否符合预期。

2. TestSuite(测试套件)

  1. 定义与作用:
    • TestSuite用于组合多个测试用例或测试套件,形成一个更大的测试集合。它可以将多个相关的测试用例组织在一起,方便一次性执行。
    • 通过TestSuite,可以灵活地选择要执行的测试用例,以及控制测试的执行顺序。
  1. 主要方法:

例如:

import unittestclass TestA(unittest.TestCase):def test_a(self):passclass TestB(unittest.TestCase):def test_b(self):passsuite = unittest.TestSuite()
suite.addTest(TestA('test_a'))
suite.addTest(TestB('test_b'))
    • addTest(test_case):将一个测试用例添加到测试套件中。
    • addTests(test_cases):将多个测试用例添加到测试套件中。

3. TestRunner(测试运行器)

  1. 定义与作用:
    • TestRunner负责执行测试用例或测试套件,并生成测试结果报告。它可以将测试结果以文本形式或其他格式输出,以便开发者查看测试的执行情况。
    • 不同的TestRunner可以提供不同的输出格式和功能,例如TextTestRunner以文本形式输出测试结果,而一些第三方库可以生成 HTML 格式的测试报告。
  1. 主要方法:

例如:

import unittestsuite = unittest.TestSuite()
# 添加测试用例到套件
runner = unittest.TextTestRunner()
result = runner.run(suite)
    • run(test):执行给定的测试用例或测试套件,并返回一个TestResult对象,其中包含测试的结果信息。

4. 示例代码:

4.1. 新建一个文件test01.py,用例如下:
import unittestdef sum_( a, b):return a + bclass TestA(unittest.TestCase):def test_add_1(self):result = sum_(1, 2)self.assertEqual(result, 3)def test_add_2(self):result = sum_(2, 3)self.assertNotEqual(result, 4)
4.2. 新建一个文件test02.py,用例如下:
import unittestdef sub_( a, b):return a - bclass TestB(unittest.TestCase):def test_sub_1(self):result = sub_(4, 2)self.assertEqual(result, 2)def test_sub_2(self):result = sub_(4, 1)self.assertNotEqual(result, 4)
4.3. 新建一个文件003.py,通过TestSuite选择用例进行执行:
import unittest
import test01
import test02suite = unittest.TestSuite()
# 添加test01文件中的用例test_add_1
suite.addTest(test01.TestA("test_add_1"))
# 添加test02文件中的用例test_sub_1
suite.addTest(test02.TestB("test_sub_1"))
runner = unittest.TextTestRunner()
runner.run(suite)

5. TestLoader(测试加载器)

5.1. 定义与作用
    • TestLoader用于自动发现和加载测试用例。它可以根据指定的规则搜索测试模块、测试类和测试方法,并将它们加载到测试套件中。
    • TestLoader使得开发者可以方便地组织和执行大量的测试用例,而无需手动添加每个测试用例到测试套件中。
5.2. 主要方法

例如:

import unittestloader = unittest.TestLoader()
suite = loader.loadTestsFromModule(__name__)
    • loadTestsFromModule(module):从一个 Python 模块中加载测试用例。
    • loadTestsFromTestCase(test_case_class):从一个测试用例类中加载测试用例。
    • loadTestsFromName(name):根据给定的名称加载测试用例,可以是模块名、类名或方法名。
5.3. 示例
5.3.1. loadTestsFromModule(module)

创建一个名为my_module.py的模块,其中包含以下测试用例类:

# my_module.py
import unittestclass MyTestCase1(unittest.TestCase):def test_method1(self):self.assertEqual(2 + 2, 4)class MyTestCase2(unittest.TestCase):def test_method2(self):self.assertTrue(5 > 3)

使用loadTestsFromModule执行用例

import unittest
import my_moduleloader = unittest.TestLoader()
suite = loader.loadTestsFromModule(my_module)runner = unittest.TextTestRunner()
runner.run(suite)
5.3.2. loadTestsFromTestCase(test_case_class)

创建一个测试用例类定义如下:

import unittestclass MySpecialTestCase(unittest.TestCase):def test_something(self):self.assertEqual(3 * 3, 9)def test_another_thing(self):self.assertFalse(2 == 3)

使用loadTestsFromTestCase执行用例

import unittest
from your_module import MySpecialTestCaseloader = unittest.TestLoader()
suite = loader.loadTestsFromTestCase(MySpecialTestCase)runner = unittest.TextTestRunner()
runner.run(suite)
5.3.3. loadTestsFromName(name)
  1. 以模块名为例:
    • 创建一个模块test_module.py,其中包含测试用例类。
# test_module.py
import unittestclass TestInModule(unittest.TestCase):def test_one(self):self.assertEqual(4 * 2, 8)
import unittestloader = unittest.TestLoader()
suite = loader.loadTestsFromName('test_module') # 注意这里有引号runner = unittest.TextTestRunner()
runner.run(suite)
  1. 以类名为例:
    • 继续使用上面的test_module.py模块。
import unittestloader = unittest.TestLoader()
suite = loader.loadTestsFromName('test_module.TestInModule') # 注意这里有引号runner = unittest.TextTestRunner()
runner.run(suite)
  1. 以方法名为例:
    • 同样使用上面的模块。
import unittestloader = unittest.TestLoader()
suite = loader.loadTestsFromName('test_module.TestInModule.test_one') # 注意这里有引号runner = unittest.TextTestRunner()
runner.run(suite)

6. Fixture

6.1. 定义与作用
    • Fixture 是在测试用例执行前后执行的一组操作,用于设置测试环境和清理资源。例如,在测试数据库操作时,可以在测试用例执行前连接数据库,在测试用例执行后关闭数据库连接。
    • Fixture 可以确保每个测试用例都在相同的初始状态下执行,提高测试的可重复性和可靠性。
6.2. 主要方法

例如:

import unittestclass MyTest(unittest.TestCase):@classmethoddef setUpClass(cls):print("Set up class.")def setUp(self):print("Set up.")def test_method(self):print("Running test method.")def tearDown(self):print("Tear down.")@classmethoddef tearDownClass(cls):print("Tear down class.")
    • setUp():在每个测试用例执行前调用,用于设置测试环境。
    • tearDown():在每个测试用例执行后调用,用于清理测试环境。
    • setUpClass():在测试类的所有测试用例执行前调用一次,通常用于执行一些耗时的初始化操作,如连接数据库。
    • tearDownClass():在测试类的所有测试用例执行后调用一次,用于清理资源,如关闭数据库连接。

总之,unittest的这些核心要素相互配合,提供了一个强大的测试框架,帮助开发者编写、组织和执行单元测试,以确保代码的质量和稳定性。

三、断言(Assertions)

1. 定义和作用

    • 断言是用于验证测试结果是否符合预期的语句。在测试用例中,通过断言来检查实际结果与预期结果是否一致。如果断言失败,测试用例将被标记为失败。
    • 断言可以帮助开发者快速发现代码中的错误,提高代码的质量和可靠性。

2. 常见的断言方法

例如:

import unittestclass MyTest(unittest.TestCase):def test_equal(self):self.assertEqual(2 + 2, 4)def test_not_equal(self):self.assertNotEqual(2 + 2, 5)def test_true(self):self.assertTrue(2 < 3)def test_false(self):self.assertFalse(2 > 3)
    • assertEqual(a, b):断言 ab 相等。
    • assertNotEqual(a, b):断言 ab 不相等。
    • assertTrue(x):断言 xTrue
    • assertFalse(x):断言 xFalse
    • assertIs(a, b):断言 ab 是同一个对象。
    • assertIsNot(a, b):断言 ab 不是同一个对象。
    • assertIsNone(x):断言 xNone
    • assertIsNotNone(x):断言 x 不是 None
    • assertIn(a, b):断言 ab 中。
    • assertNotIn(a, b):断言 a 不在 b 中。

四、参数化(Parameterization)

1. 定义和作用

    • 参数化测试是一种将相同的测试逻辑应用于不同的输入数据的技术。通过参数化,可以减少重复的测试代码,提高测试的效率和覆盖度。
    • 参数化测试可以使用不同的输入数据来验证代码的正确性,从而发现更多的错误。

2. 实现方法

2.1. 使用 unittest.TestCase.subTest() 方法
    • 使用 unittest.TestCase.subTest() 方法:可以在一个测试方法中使用 subTest 方法来对不同的输入数据进行测试。每次调用 subTest 方法时,都会执行相同的测试逻辑,但使用不同的输入数据。
import unittestclass MyTest(unittest.TestCase):def test_addition(self):data = [(2, 3, 5), (4, 5, 9), (6, 7, 13)]for a, b, expected in data:with self.subTest(a=a, b=b):self.assertEqual(a + b, expected)
2.2. 使用第三方库
    • pytestparameterized:这些库提供了更强大的参数化测试功能,可以更方便地实现参数化测试。
    • 安装第三方库: pip install parameterized
    • 导包:from parameterized import parameterized
    • 代码示例:
import unittest
from parameterized import parameterizeddef add_numbers(a, b):return a + bclass TestAddNumbers(unittest.TestCase):@parameterized.expand([(1, 2, 3),(4, 5, 9),(10, -5, 5)])def test_add_numbers(self, a, b, expected_result):result = add_numbers(a, b)self.assertEqual(result, expected_result)if __name__ == '__main__':unittest.main()

五、跳过(Skipping)

1. 定义和作用

    • 有时候,某些测试用例可能在特定的条件下不适合执行,或者已知存在问题。在这种情况下,可以使用跳过机制来跳过这些测试用例,避免不必要的失败。
    • 跳过测试用例可以提高测试的效率,并且可以在特定的情况下避免错误的报告。

2. 实现方法

例如:

import unittestclass MyTest(unittest.TestCase):@unittest.skip("This test is skipped for now.")def test_skipped_method(self):pass@unittest.skipIf(2 > 3, "This test is skipped if 2 > 3.")def test_skipped_if_method(self):pass@unittest.skipUnless(2 < 3, "This test is skipped unless 2 < 3.")def test_skipped_unless_method(self):pass
    • 使用 unittest.skip(reason) 装饰器:可以在测试方法上使用 skip 装饰器来跳过该测试用例。reason 参数是一个字符串,用于说明跳过的原因。
    • 使用 unittest.skipIf(condition, reason) 装饰器:可以根据特定的条件来跳过测试用例。如果 conditionTrue,则跳过该测试用例。
    • 使用 unittest.skipUnless(condition, reason) 装饰器:与 skipIf 相反,只有当 conditionTrue 时,才执行该测试用例。

六、生成 HTML 测试报告

1. 定义和作用

    • 生成 HTML 测试报告可以将测试结果以更直观的形式展示出来,方便开发者查看和分析测试结果。
    • HTML 测试报告可以包含测试用例的名称、执行时间、结果状态等信息,以及详细的错误信息和堆栈跟踪。

2. 实现方法

例如,使用 HTMLTestRunner(这里可能会出现兼容问题,生成报告内容为空,具体问题具体解决):

import unittest
import HTMLTestRunnerclass MyTest(unittest.TestCase):def test_method(self):self.assertEqual(2 + 2, 4)if __name__ == '__main__':suite = unittest.TestLoader().loadTestsFromTestCase(MyTest)with open('test_report.html', 'wb') as f:runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='Test Report', description='Unit Test Results')runner.run(suite)

参数说明:

stream:open 函数打开的文件流;

title:[可选参数],为报告标题;

description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本;

    • 使用第三方库,如 HTMLTestRunnerHTMLTestRunner 是一个用于生成 HTML 测试报告的第三方库。可以将测试用例的执行结果输出为 HTML 格式的报告。
    • 使用 unittestTextTestRunner 并结合其他工具:可以使用 TextTestRunner 来执行测试用例,并将结果输出到一个文件中。然后,可以使用其他工具将文本报告转换为 HTML 格式的报告。

总之,unittest模块提供了丰富的功能来支持单元测试,包括Fixture、断言、参数化、跳过和生成 HTML 测试报告等。这些功能可以帮助开发者提高代码的质量和可靠性,并且可以更方便地进行测试和调试。

相关文章:

软件测试基础十七(python Unittest)

Unittest 一、Unittest 简介 unittest是 Python 内置的标准测试框架&#xff0c;用于编写和运行单元测试。它提供了一组工具和类&#xff0c;帮助开发者组织、编写和执行测试用例&#xff0c;以验证代码的正确性。 二、Unittest 核心要素 1. TestCase&#xff08;测试用例类…...

技术领导者的道与术:从领导者到领导力

目录标题 领导者现实看起来是这样技术领导者不应该和个人坐在一起技术领导力仍然是必须的从技术领导到技术领导力小结领导者 你可能想成为或者已经是一位技术领导者,估计你现在心里想成为超级英雄的想法正在爆棚。 你是Java、JavaScript、Angular等技术的专家,公司的项目代…...

Starrocks Compaction的分析

背景 本文基于 Starrocks 3.1.7 结论 Starrocks 会启动一个线程周期性的去进行Compaction&#xff0c;该周期间隔为 200 MS, 该Compaction以table的partition为切入点&#xff0c;tablet(也就是bucket)为粒度进行task的创建。 分析 CompactionMgr start 方法会启动一个Com…...

淘淘商城实战高并发分布式项目(有源码)

通过百度网盘分享的文件&#xff1a;淘淘商城实战高并发分布式项目(有源码) 链接&#xff1a;https://pan.baidu.com/s/1V94gRALxHgMVwpcXoE-miA?pwdglu7 提取码&#xff1a;glu7 在互联网技术飞速发展的当下&#xff0c;高并发分布式项目成为了众多电商平台等大型应用的核心…...

内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?

相关技术 要实现“内网部署&#xff0c;外网访问”&#xff0c;可以使用内网穿透、VPN技术、DMZ主机、端口映射等方法。以下是对这些方法的详细解释&#xff1a; 一、内网穿透 内网穿透是一种技术&#xff0c;它通过将内网设备映射到公网上的方式&#xff0c;实现外网访问内…...

Jenkins系列

jenkins 1、搭建Jenkins 搭建Jenkins 2、这是什么 3、这是什么 4、 这是什么 5、这是什么 文章目录 jenkins1、搭建Jenkins2、这是什么3、这是什么4、 这是什么5、这是什么 前言 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随…...

技术总结(二十四)

一、Redis 分布式锁的常见使用场景有哪些&#xff1f; 资源竞争控制 数据库事务控制&#xff1a;在分布式系统中&#xff0c;多个服务可能会同时对数据库中的同一行数据进行操作。例如&#xff0c;在一个电商系统里&#xff0c;多个订单处理服务可能会同时尝试更新同一个订单的…...

原生鸿蒙应用市场:赋能开发者全生命周期服务体验

文章目录 背景自动化检测前移&#xff1a;早发现&#xff0c;早解决技术细节&#xff1a;静态代码分析与兼容性测试应用场景 按需加载&#xff1a;优化性能&#xff0c;提升用户体验技术细节&#xff1a;模块化与懒加载实现应用场景 应用加密&#xff1a;保护应用代码安全&…...

深入解析TOML、XML、YAML和JSON:优劣对比与场景应用

摘要&#xff1a;本文将介绍四种常见的配置文件和数据交换格式&#xff1a;TOML、XML、YAML和JSON&#xff0c;通过具体的使用例子分析它们的优缺点&#xff0c;并探讨在不同场景下的应用选择。 正文&#xff1a; 一、TOML 优点&#xff1a; 易于阅读和编写&#xff1a;TOML的…...

前端UniApp面试题及参考答案(100道题)

目录 UniApp 支持哪些平台? UniApp 在不同平台上的表现有何差异? 如何处理 UniApp 中的平台差异? UniApp 项目创建与目录结构 项目创建 目录结构 如何创建一个 UniApp 项目? UniApp 项目的基本目录结构是什么样的? 解释一下 UniApp 中的页面生命周期钩子函数有哪…...

MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!

2024-11-04 MoonBit更新 增加了编译期常量的支持。常量的名字以大写字母开头&#xff0c;用语法 const C ... 声明。常量的类型必须是内建的数字类型或 String。常量可以当作普通的值使用&#xff0c;也可以用于模式匹配。常量的值目前只能是字面量&#xff1a; const MIN_…...

Linux相关概念和易错知识点(20)(dentry、分区、挂载)

目录 1.dentry &#xff08;1&#xff09;路径缓存的原因 &#xff08;2&#xff09;dentry的结构 ①多叉树结构 ②file和dentry之间的联系 ③路径概念存在的意义 2.分区 &#xff08;1&#xff09;为什么要确认分区 &#xff08;2&#xff09;挂载 ①进入分区 ②被挂…...

论 ONLYOFFICE:开源办公套件的深度探索

公主请阅 引言第一部分&#xff1a;ONLYOFFICE 的历史背景1.1 开源软件的崛起1.2 ONLYOFFICE 的发展历程 第二部分&#xff1a;ONLYOFFICE 的核心功能2.1 文档处理2.2 电子表格2.3 演示文稿 第三部分&#xff1a;技术架构与兼容性3.1 技术架构3.2 兼容性 第四部分&#xff1a;部…...

兵马未动,粮草先行-InnoDB统计数据是如何收集的

我们前面介绍查询成本的时候经常用到一些统计数据&#xff0c;比如通过SHOW TABLE STATUS可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;本章将聚焦…...

oracle服务器意外宕机数据库启动失败故障处理记录

客户反馈由于服务器意外宕机&#xff0c;导致数据库业务不能正常运行&#xff0c;经过一番努力后通过redo日志恢复成功&#xff01; 故障描述&#xff1a;ORA-00600: 内部错误代码, 参数: [krctcr_4], [1179922061], [1179942042], [], [], [], [], [], [], [], [], [] 现将主要…...

学习笔记——MathType公式编号:右编号和随章节变化

1.如何在word文档中插入带有编号的公式&#xff1f; 步骤&#xff1a;(前提是已经安装mathtype) 2.MathType公式编号怎么随章节变化&#xff1f; 想要编号级数也随标题级数进行自动变化&#xff0c;则需要插入或修改文档的“分隔符” 步骤&#xff1a;...

如何使用 SSH 连接并管理你的 WordPress 网站

在当今数字化的世界里&#xff0c;网站的管理与维护至关重要。对于使用 WordPress 搭建网站的用户而言&#xff0c;掌握基本的 SSH&#xff08;安全壳&#xff09;命令能够极大地简化网站管理工作。本指南将向你介绍 SSH 的基本知识&#xff0c;并教你如何通过 SSH 连接和管理你…...

力扣60. 排列序列

描述 力扣60. 排列序列 给出集合 [1,2,3,…,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; “123” “132” “213” “231” “312” “321” 给定 n 和 k&#xff0c;返回…...

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…...

时间管理应用(可复制源码)

创建一个简单的时间管理应用程序&#xff0c;结合 Pomodoro 技术使用 HTML、CSS 和 JavaScript 1. HTML 创建一个基本的 HTML 文件 (index.html)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"&…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...