(一看必懂) Python 自定义模块中的 if __name__=='__main__': 详细解读

本文主要探讨Python中__name__变量的作用。运行本程序时,__name__值为__main__;导入模块时,__name__值为模块名。if __name__=='__main__'用于判断__name__是否为__main__,可方便调试模块,导入模块时不执行if下语句。

一. 在解释之前首先我们看下 __name__ 这个变量存的是什么?

#!/usr/bin/env python
# -*- coding:utf-8 -*- 

print(__name__)

# 执行结果:
__main__

结果分析:

  • 当我们运行的本程序的时候,__name__ 这个内置变量值就是 __main__

 

二. 下面我们来看下导入模块时候 __name__ 变量值

  • test.py代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*- 

def main():
    print("this is before if __name__:%s" % __name__)


if __name__=='__main__':
    main()
    print("this is after if __name__:%s" % __name__)
  • 导入 test 模块并执行
#/usr/bin/env python
# -*- coding:utf-8 -*-

# 导入我们自定义的 test 模块
import test

# 调用 test 模块里的 main 方法
test.main()


# 执行结果:
# 此时 __name__ 指向的而是 test 模块的名字
this is before if __name__:test

结果分析:

  • 可以看到,导入模块后变量 __name__ 值为 test 模块名,并 没有执行 if 中的语句

 

总结:

  • if __name__=='__main__' 说白了,就是判断 __name__ 变量是不是等于 __main__,
    • 当执行文件本身时候 __name__ 变量等于 __main__,此时判断成立并执行判断语句中的代码
    • 当调用该模块的时候 __name__ 并不等于__main__,条件不成立,不执行 if 判断下面的语句
    • 这里可以认为为了方便调试模块,而在模块被导入的时候并不执行 if 下面的语句
<think> 我们有一个Python脚本,它使用`optparse`模块解析命令行参数,然后根据参数执行不同的pytest测试命令。 脚本的主要功能是运行指定的测试用例并生成JSON格式的测试报告。 步骤分析: 1. 导入模块:os, sys, optparse 2. 定义报告路径和报告名称常量 3. 主程序入口:解析命令行参数 4. 使用OptionParser定义两个选项: --type: 用于指定测试类型,有'all'和'ff_debug'等选项,默认为'none' --cases: 用于指定具体的测试用例文件,默认为'none' 5. 根据选项构建要运行的测试用例路径字符串 6. 使用os.system执行pytest命令,并生成JSON报告 具体代码逻辑: - 如果--type为'none'(默认值),则运行两个目录下的所有测试用例:'./test_cases/test_*.py' 和 './test_cases/test_edge_cases/test_*.py' - 如果--type为"ff_debug",则运行特定的测试文件:'./test_cases/test_ff_debug/test_ff_debug.py',并且报告名称追加'_ff_debug' - 如果--type为其他值(比如'all'),则运行'./test_cases/test_*.py' - 如果指定了--cases且不为'none',则覆盖前面根据--type构建的cases,直接使用--cases指定的测试用例 最后,使用pytest命令执行测试,其中: -s: 输出所有测试用例的输出(例如print语句) -v: 详细输出 --json-report: 生成JSON报告 --json-report-file: 指定报告文件路径 报告文件路径为:REPROT_PATH(即'__result_json__'目录)下的报告文件,文件名为report_name(根据选项变化)加上.json后缀。 注意:os.system执行命令时,将cases字符串拼接到命令中。 举例: 1. 默认运行(不带任何参数): 相当于:pytest -s -v ./test_cases/test_*.py ./test_cases/test_edge_cases/test_*.py --json-report --json-report-file=__result_json__/idns_test_report.json 2. 指定--type=ff_debug: 相当于:pytest -s -v ./test_cases/test_ff_debug/test_ff_debug.py --json-report --json-report-file=__result_json__/idns_test_report_ff_debug.json 3. 指定--cases=./test_cases/test_example.py: 相当于:pytest -s -v ./test_cases/test_example.py --json-report --json-report-file=__result_json__/idns_test_report.json 注意:如果同时指定了--type和--cases,那么--cases会覆盖--type构建的cases。 因此,这个脚本是一个测试运行器,用于灵活地运行不同的测试集并生成JSON格式的测试报告。 </think> ### Python文件功能解读 该脚本实现了一个**pytest测试运行控制工具**,通过命令行参数动态指定测试范围和生成JSON格式的测试报告。以下是核心功能解析: --- ### 、核心功能模块 #### 1. 命令行参数解析 ```python parser = OptionParser(usage="%prog [options]", prog="python3 run.py") parser.add_option("--type", action="store", dest="test", default='none', metavar="{ all | ff_debug}", help="指定测试类型:all-所有用例, ff_debug-特定调试用例") # [^1] parser.add_option("--cases", action="store", dest="cases", default='none', help="指定具体测试文件路径,如:./test_cases/test_block_vni.py") # [^1] ``` **功能说明**: - `--type`:选择预定义的测试套件类型 - `--cases`:精确指定测试文件路径 - 使用`optparse`模块实现Unix风格命令行参数解析 #### 2. 测试路径动态组装 ```python if options.test == 'none': cases += ' ./test_cases/test_*.py' # 主测试目录 cases += ' ./test_cases/test_edge_cases/test_*.py' # 边界用例目录 elif options.test == "ff_debug": cases += ' ./test_cases/test_ff_debug/test_ff_debug.py' # 调试专用用例 report_name += '_ff_debug' ``` **路径匹配规则**: - 通配符`*`匹配目录下所有测试文件 - 支持多目录组合测试(主测试+边界测试) - 报告名称根据测试类型动态调整 #### 3. pytest执行引擎 ```python os.system(f'pytest -s -v {cases} --json-report --json-report-file={REPROT_PATH}/{report_name}.json') # [^3] ``` **关键参数**: - `-s`:显示测试中的print输出 - `-v`:显示详细测试结果 - `--json-report`:生成JSON格式测试报告 - 报告保存到`__result_json__/idns_test_report[_类型].json` --- ### 二、典型使用场景 #### 场景1:运行全量测试 ```bash python3 run.py --type=all ``` **执行效果**: 1. 运行`test_cases/`和`test_edge_cases/`所有测试 2. 生成报告:`__result_json__/idns_test_report.json` #### 场景2:运行特定调试用例 ```bash python3 run.py --type=ff_debug ``` **执行效果**: 1. 仅运行`test_ff_debug.py`测试文件 2. 生成专用报告:`__result_json__/idns_test_report_ff_debug.json` #### 场景3:自定义测试文件 ```bash python3 run.py --cases=./test_cases/test_network.py ``` **执行效果**: 1. 仅运行指定测试文件 2. 生成默认名称报告 --- ### 三、关键技术解析 1. **pytest参数化测试** 通过`@pytest.mark.parametrize`实现多参数组合测试[^1]: ```python @pytest.mark.parametrize("input,expected", [ ("3+5", 8), ("2*4", 8), ("6/2", 3) ]) def test_eval(input, expected): assert eval(input) == expected ``` 2. **JSON测试报告** 使用`pytest-json-report`插件生成结构化报告,包含: ```json { "created": 1689327898.123, "duration": 12.345, "exitcode": 0, "root": [], "collectors": [], "tests": [ { "nodeid": "test_module.py::test_case", "outcome": "passed", "duration": 0.123 } ] } ``` 3. **CI/CD集成** 报告文件可直接被GitLab CI等工具解析[^3]: ```yaml unit_test: script: - python3 run.py --type=all artifacts: paths: - __result_json__/*.json ``` --- ### 四、配置文件与扩展 1. **依赖管理** 通过`pyproject.toml`管理测试依赖[^2]: ```toml [dependency-groups] dev = [ "coverage==7.10.7", # 覆盖率工具 "pytest-json-report" # JSON报告插件 ] ``` 2. **扩展能力** 支持通过插件扩展: - `pytest-cov`:代码覆盖率分析 - `pytest-xdist`:分布式测试 - `pytest-mock`:Mock对象支持
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值