动态模块导入示例、断言

Python模块动态导入示例

import importlib from wxpython.Frame import MyFrame aa = importlib.import_module('wxpython.Frame') print aa.MyFrame()

 断言:

assert type(obj.name) is int

 

转载于:https://www.cnblogs.com/qiangayz/p/8596344.html

# -*- coding: utf-8 -*- """ ============================ Python 导入机制详解(测试工程师专用) ============================ 版本:2.0 | 测试相关模块导入详解 """ # ==================== # 第一部分:导入机制概述 # ==================== """ 测试工程师需要掌握的导入核心功能: 1. 测试代码复用:避免重复编写测试用例 2. 测试模块化:分离测试框架、测试用例和工具类 3. 命名空间管理:防止测试工具命名冲突 测试专用导入方式: 1. 基本导入 (import unittest) 2. 别名导入 (import pytest as pt) 3. 选择性导入 (from unittest import TestCase) 4. 多对象导入 (from unittest import TestCase, mock) 5. 通配符导入 (from unittest import *)【不推荐】 6. 相对导入 (from .test_utils import create_test_data)【包内使用】 7. 动态导入 (importlib.import_module("pytest")) 8. 延迟导入(在测试方法内部导入) """ # ==================== # 第二部分:测试相关导入详解 # ==================== # -------------------- # 1. 基本导入 (import) # -------------------- """ 基本导入整个测试模块 • 优点: 避免命名冲突 • 缺点: 代码稍长 • 测试应用: 导入完整测试框架 """ import unittest # Python标准测试框架,用于构建测试用例和测试套件 import doctest # 用于执行文档中的测试用例,验证代码示例 class MathTest(unittest.TestCase): """基本导入示例:单元测试""" def test_addition(self): """测试加法运算""" result = 2 + 3 # 使用unittest的断言方法验证结果 self.assertEqual(result, 5) # 验证2+3等于5 def test_doctest_example(): """基本导入示例:文档测试""" # 在函数文档中嵌入测试用例 """ >>> import math >>> math.sqrt(16) 4.0 """ # 执行文档中的测试 doctest.testmod() # 自动检测并运行文档中的测试用例 # -------------------- # 2. 别名导入 (import as) # -------------------- """ 别名导入简化长测试模块名 • 优点: 简化代码 • 测试应用: 测试框架别名 """ import pytest as pt # 第三方测试框架,使用别名pt简化 import xml.etree.ElementTree as ET # XML处理模块,测试中用于解析测试报告 @pt.fixture def test_data(): """别名导入示例:pytest测试夹具""" # 创建测试数据 return [1, 2, 3, 4, 5] # 返回一个整数列表作为测试数据 def test_sum(test_data): """使用夹具的测试用例""" # 使用pytest的断言语法 assert sum(test_data) == 15 # 验证列表求和结果 def test_xml_parsing(): """别名导入示例:XML测试报告解析""" # 模拟XML测试报告 xml_report = """ <testsuite> <testcase name="test_login" status="passed"/> <testcase name="test_logout" status="failed"/> </testsuite> """ # 使用别名解析XML root = ET.fromstring(xml_report) # 验证测试用例数量 assert len(root.findall('testcase')) == 2 # 确保有两个测试用例 # -------------------- # 3. 选择性导入 (from import) # -------------------- """ 仅导入需要的测试组件 • 优点: 代码简洁 • 测试应用: 导入特定测试类或工具 """ from unittest import TestCase, mock # 仅导入需要的测试组件 from datetime import datetime # 导入时间处理类,用于测试时间相关功能 class LoginTest(TestCase): """选择性导入示例:单元测试类""" @mock.patch('api.get_user') def test_login_success(self, mock_get_user): """模拟登录成功测试""" # 配置模拟返回值 mock_get_user.return_value = {'id': 1, 'name': 'test_user'} # 调用被测函数 result = login('valid_user', 'valid_pass') # 验证登录结果 self.assertTrue(result['success']) # 断言登录成功 def test_timestamp_format(): """选择性导入示例:时间格式验证""" # 生成测试时间戳 test_time = datetime(2023, 10, 15, 14, 30) # 格式化时间 formatted = test_time.strftime("%Y-%m-%d %H:%M") # 验证格式 assert formatted == "2023-10-15 14:30" # 确保时间格式正确 # -------------------- # 4. 多对象导入 (from import) # -------------------- """ 一次性导入多个测试组件 • 优点: 减少导入行数 • 测试应用: 导入多个关联测试工具 """ from collections import Counter, defaultdict # 导入多个数据统计工具 from unittest import TestCase, skip, expectedFailure # 导入多个测试装饰器 class StatsTest(TestCase): """多对象导入示例:数据统计测试""" def test_counter(self): """测试Counter计数功能""" data = ['pass', 'fail', 'pass', 'skip'] counts = Counter(data) # 验证计数结果 self.assertEqual(counts['pass'], 2) # pass应出现2次 @skip("暂不执行") def test_skip_example(self): """被跳过的测试用例""" # 此测试不会执行 self.assertTrue(False) @expectedFailure def test_expected_failure(self): """预期失败的测试""" # 已知有问题的测试 self.assertEqual(1, 2) # 预期会失败 # -------------------- # 5. 通配符导入 (from import *) # -------------------- """ 导入模块所有公共对象(不推荐) • 缺点: 命名空间污染 • 测试应用: 仅演示,实际避免使用 """ # 不推荐在实际测试代码中使用 from math import * # 导入所有数学函数 def test_math_functions(): """通配符导入示例:数学函数测试""" # 直接使用导入的函数 assert sqrt(25) == 5 # 平方根函数 assert ceil(4.2) == 5 # 向上取整函数 assert floor(4.9) == 4 # 向下取整函数 # -------------------- # 6. 相对导入 (包内使用) # -------------------- """ 包内模块间的导入方式 • 优点: 避免绝对路径冲突 • 测试应用: 测试代码组织 """ # 假设在测试包中的结构: # tests/ # ├── __init__.py # ├── test_api.py # └── utils/ # ├── __init__.py # └── test_helpers.py # 在test_api.py中: from .utils.test_helpers import create_test_user # 相对导入工具函数 def test_user_creation(): """相对导入示例:用户创建测试""" user = create_test_user() assert user.is_authenticated() # 验证用户认证状态 # -------------------- # 7. 动态导入 # -------------------- """ 运行时按需加载测试模块 • 优点: 灵活处理依赖 • 测试应用: 条件加载不同测试框架 """ import importlib # 动态导入工具 def run_tests(test_type): """动态导入示例:按需加载测试框架""" if test_type == "unit": # 动态导入单元测试模块 unittest = importlib.import_module('unittest') unittest.main() elif test_type == "doc": # 动态导入文档测试模块 doctest = importlib.import_module('doctest') doctest.testmod() # -------------------- # 8. 延迟导入 # -------------------- """ 在测试方法内部导入 • 优点: 减少启动时间 • 测试应用: 减少测试套件加载时间 """ def test_image_comparison(): """延迟导入示例:图像比较测试""" # 仅在需要时导入图像处理模块 from PIL import Image, ImageChops # 图像处理库 # 创建测试图像 img1 = Image.new('RGB', (100, 100), 'red') img2 = Image.new('RGB', (100, 100), 'red') # 比较图像差异 diff = ImageChops.difference(img1, img2) # 验证无差异 assert diff.getbbox() is None # 确保图像完全相同 def test_dataframe_operations(): """延迟导入示例:Pandas数据测试""" # 仅当执行测试时导入 import pandas as pd # 创建测试数据 data = {'id': [1, 2], 'name': ['Test1', 'Test2']} df = pd.DataFrame(data) # 验证数据形状 assert df.shape == (2, 2) # 确保2行2列 # ==================== # 第三部分:测试导入最佳实践 # ==================== """ 测试工程师专用导入规范: 1. 导入顺序: a. Python标准库 (import unittest) b. 第三方测试框架 (import pytest) c. 项目测试模块 (from . import test_utils) 2. 测试专用建议: • 使用明确的断言导入: from unittest import TestCase, assertEqual • 避免测试文件间的循环导入 • 使用相对导入组织测试包 • 在测试夹具中使用延迟导入减少开销 3. 测试环境管理: • 使用try-except处理可选测试依赖 • 在conftest.py中统一管理pytest导入 • 使用动态导入处理多版本兼容 """ # ==================== # 测试专用模块参考 # ==================== """ 常用测试模块: 1. unittest - 标准单元测试框架 2. doctest - 文档测试工具 3. pytest - 第三方全功能测试框架 4. mock - 模拟对象库(Python 3.3+内置) 5. coverage - 代码覆盖率工具 6. xml.etree.ElementTree - XML测试报告解析 7. datetime - 时间敏感测试 8. collections - 测试数据统计 测试数据生成: 1. Faker - 生成假数据 2. Hypothesis - 基于属性的测试 """ # ==================== # 总结 # ==================== """ 测试工程师导入要点: 1. 基本导入:完整框架导入 2. 别名导入:简化pytest等长模块名 3. 选择性导入:精确获取测试组件 4. 多对象导入:关联测试工具批量导入 5. 相对导入:组织测试包结构 6. 动态导入:灵活加载测试框架 7. 延迟导入:优化测试启动时间 掌握这些导入技巧,编写高效、可维护的测试代码。 """ # 测试执行入口 if __name__ == "__main__": print("=" * 50) print("测试导入机制演示开始") print("=" * 50) # 执行测试用例 import sys if len(sys.argv) > 1 and sys.argv[1] == "pytest": # 动态执行pytest pytest = importlib.import_module('pytest') pytest.main(['-v']) else: # 执行unittest unittest = importlib.import_module('unittest') test_loader = unittest.TestLoader() test_suite = test_loader.loadTestsFromModule(sys.modules[__name__]) unittest.TextTestRunner().run(test_suite) print("=" * 50) print("测试导入演示完成") print("=" * 50) 我这节课的核心还是去讲导入怎么用,其中自动化的部分和文件处理的部分,替换成更简单的例子吧
08-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值