【python】自动化测试框架--nose

2023-11-17

一、准备

下载地址:: nose.

命令下载:

pip install nose

二、nose介绍

1.更容易编写,查找和运行测试。

2.nose将在当前工作目录下的文件或目录中运行测试,这些文件或目录的名称在单词边界处包括“ test”或“ Test”(例如“ test_this”或“ functional_test”或“ TestClass”,但不包括“ libtest”)。测试输出类似于unittest的输出,但还包括从失败的测试中捕获的stdout输出,以方便进行打印样式的调试。

优势:

  • 自动发现测试用例(包含[Tt]est文件以及文件包中包含test的函数)

  • 以test开头的文件

  • 以test开头的函数或方法

  • 以Test开头的类

三、看个简单的例子了解下

# coding = utf-8

class Testdemo:

    def __init__(self):
        pass

    def setup(self):
        print 'start'
        
    def testfunc1(self):
        print 'this is func1'

    def testfunc2(self):
        print 'this is func2'

    def testfunc3(self):
        print 'this is func3'
        
    def teardown(self):
        print 'stop'


nosetests -s

在这里插入图片描述

三、nose常用命令简单介绍

常用的几个nosetests命令:

1、查看所有nose相关命令
nosetests  -h
2、 执行并捕获输出
nosetests -s
3、 提供XUnit XML 格式的测试结果,并存储在nosetests.xml文件中。主要为jenkins等能理解xnuit格式文件的集成测试环境准备。
nosetests -with-xunit  
4、 查看nose的运行信息和调试信息
nosetests -v   

在这里插入图片描述

5、 目录 指定一个目录运行测试
nosetests -w  XXX

在这里插入图片描述
在这里插入图片描述

6、只执行上次执行结果中的失败用例

该插件还添加了一种模式,该模式将指导测试运行器记录失败的测试。随后的测试运行将仅运行上次失败的测试。使用–failed开关激活此模式:

nosetests -v --failed

首次使用,执行之后记录下失败用例
在这里插入图片描述
再次使用,只执行失败用例
在这里插入图片描述

7.出现故障或错误时放入调试器,可用于打断点调试
nosetests -s --pdb

test1.py举例,testfunc1函数中出现a = 0/0 语法错误,执行nosetests -s --pdb,出现调试

# coding = utf-8

class Testdemo:

    def __init__(self):
        pass

    def setup(self):
        print 'start'

    def testfunc1(self):
        a =0/0
        print a
        print 'this is func1'

在这里插入图片描述
ctrl+D中断调试
在这里插入图片描述

四、nose命令大全

nosetests XXX 下面是nosetests跟不同的命令有不同的功能


-V, --version
输出nose版本并退出

-p, --plugins
可用插件的输出列表,然后退出。结合较高的详细程度以获取更多细节

-v=DEFAULT, --verbose=DEFAULT
更加冗长。[NOSE_VERBOSE]

--verbosity=VERBOSITY
设置详细程度;–verbosity = 2与-v相同

-q=DEFAULT, --quiet=DEFAULT
减少冗长

-c=FILES, --config=FILES
从配置文件加载配置。可以多次指定;在这种情况下,所有配置文件将被加载并合并

-w=WHERE, --where=WHERE
在此目录中查找测试。可以指定多次。传递的第一个目录将用作工作目录,代替当前的工作目录,这是默认目录。其他的将被添加到要执行的测试列表中。[NOSE_WHERE]

--py3where=PY3WHERE
在Python 3.x下的此目录中查找测试。功能与“ where”相同,但仅在Python 3.x或更高版本下运行时适用。请注意,如果在3.x下存在此选项,则该选项将完全替换所有以“ where”指定的目录,因此“ where”选项无效。[NOSE_PY3WHERE]

-m=REGEX, --match=REGEX, --testmatch=REGEX
与该正则表达式匹配的文件,目录,函数名称和类名称被视为测试。默认值:(?:\ b | _)[Tt] est [NOSE_TESTMATCH]

--tests=NAMES
运行这些测试(以逗号分隔的列表)。此参数主要在配置文件中有用;在命令行上,只需通过测试即可作为其他参数运行而无需切换。

-l=DEFAULT, --debug=DEFAULT
为一个或多个系统激活调试日志记录。可用的调试记录器:鼻子,鼻子。进口商,鼻子。检查器,鼻子。插件,鼻子。结果和鼻子。选择器。用逗号分隔多个名称。

--debug-log=FILE
将调试消息记录到此文件中(默认值:sys.stderr)

--logging-config=FILE, --log-config=FILE
从此文件加载日志配置–绕过所有其他日志配置设置。

-I=REGEX, --ignore-files=REGEX
完全忽略任何与此正则表达式匹配的文件。优先于其他任何设置或插件。指定此选项将替代默认设置。多次指定此选项以添加更多正则表达式[NOSE_IGNORE_FILES]

-e=REGEX, --exclude=REGEX
不要运行与正则表达式匹配的测试[NOSE_EXCLUDE]

-i=REGEX, --include=REGEX
此正则表达式将应用于文件,目录,函数名称和类名称,以便有机会包括与TESTMATCH不匹配的其他测试。多次指定此选项可添加更多正则表达式[NOSE_INCLUDE]

-x, --stop
在第一个错误或失败后停止运行测试

-P, --no-path-adjustment
加载测试时不要对sys.path进行任何更改[NOSE_NOPATH]

--exe
在可执行的python模块中查找测试。正常行为是排除可执行模块,因为它们可能不是导入安全的[NOSE_INCLUDE_EXE]

--noexe
不要在可执行的python模块中寻找测试。(Windows平台上的默认设置是这样做。)

--traverse-namespace
遍历名称空间包的所有路径条目

--first-package-wins, --first-pkg-wins, --1st-pkg-wins
如果鼻子的进口商在不同位置看到相同名称的软件包,通常会将其从sys.modules中逐出。设置此选项可禁用该行为。

--no-byte-compile
在鼻子扫描并运行测试时,防止鼻子将源字节编译为.pyc文件。

-a=ATTR, --attr=ATTR
仅运行具有ATTR [NOSE_ATTR]指定的属性的测试

-A=EXPR, --eval-attr=EXPR
仅运行测试Python表达式EXPR的属性值为True的测试[NOSE_EVAL_ATTR]

-s, --nocapture
不要捕获标准输出(任何标准输出输出将立即打印)[NOSE_NOCAPTURE]

--nologcapture
禁用日志记录捕获插件。日志配置将保持不变。[NOSE_NOLOGCAPTURE]

--logging-format=FORMAT
指定自定义格式以打印语句。使用与标准日志记录处理程序相同的格式。[NOSE_LOGFORMAT]

--logging-datefmt=FORMAT
指定自定义日期/时间格式以打印报表。使用与标准日志记录处理程序相同的格式。[NOSE_LOGDATEFMT]

--logging-filter=FILTER
指定要过滤的语句。默认情况下,所有内容都会被捕获。如果输出太冗长,请使用此选项过滤掉不必要的输出。示例:filter = foo将捕获仅发布给foo或foo.what.ever.sub的语句,而不捕获发给foobar或其他记录器的语句。用逗号指定多个记录器:filter = foo,bar,baz。如果任何记录器名称的前面都带有减号,例如filter = -foo,它将被排除而不是包含在内。默认值:从鼻子本身(-nose)排除日志消息。[NOSE_LOGFILTER]

--logging-clear-handlers
清除所有其他日志记录处理程序

--logging-level=DEFAULT
设置日志级别以捕获

--with-coverage
启用插件覆盖率:使用Ned Batchelder的覆盖率模块激活覆盖率报告。[NOSE_WITH_COVERAGE]

--cover-package=PACKAGE
将覆盖范围输出限制为选定的软件包[NOSE_COVER_PACKAGE]

--cover-erase
运行前清除先前收集的覆盖率统计信息

--cover-tests
在覆盖率报告中包含测试模块[NOSE_COVER_TESTS]

--cover-min-percentage=DEFAULT
测试通过的最低覆盖率[NOSE_COVER_MIN_PERCENTAGE]

--cover-inclusive
在覆盖率报告中的工作目录下包括所有python文件。如果不是所有文件都由测试套件导入,则对于发现测试覆盖范围中的漏洞很有用。[NOSE_COVER_INCLUSIVE]

--cover-html
产生HTML覆盖率信息

--cover-html-dir=DIR
在目录中生成HTML Coverage信息

--cover-branches
将分支机构覆盖范围包括在覆盖率报告中[NOSE_COVER_BRANCHES]

--cover-xml
生成XML覆盖率信息

--cover-xml-file=FILE
在文件中生成XML覆盖率信息

--cover-config-file=DEFAULT
覆盖范围配置文件[NOSE_COVER_CONFIG_FILE]的位置

--cover-no-print
禁止打印承保范围信息

--pdb
出现故障或错误时放入调试器

--pdb-failures
失败时放入调试器

--pdb-errors
出现错误时放入调试器

--no-deprecated
禁用DeprecatedTest异常的特殊处理。

--with-doctest
启用插件doctest:激活doctest插件以在非测试模块中查找并运行doctest。[NOSE_WITH_DOCTEST]

--doctest-tests
还要在测试模块中查找doctest。请注意,类,方法和函数应具有doctest或非doctest测试,不能同时具有两者。[NOSE_DOCTEST_TESTS]

--doctest-extension=EXT
还要在具有此扩展名[NOSE_DOCTEST_EXTENSION]的文件中查找doctest。

--doctest-result-variable=VAR
将变量名设置为默认值“ _”为最后一个解释程序命令的结果。可用于避免与用于文本翻译的_()函数冲突。[NOSE_DOCTEST_RESULT_VAR]

--doctest-fixtures=SUFFIX
在模块中查找doctest文件的固定装置,并将此名称附加到doctest文件的基本名称之后

--doctest-options=OPTIONS
指定要传递给doctest的选项。例如。'+ ELLIPSIS,+ NORMALIZE_WHITESPACE'

--with-isolation
启用插件IsolationPlugin:激活隔离插件,以将对外部模块的更改隔离到单个测试模块或程序包中。在每个测试模块或程序包运行到测试前的状态之后,隔离插件将sys.modules的内容重置。请注意,此插件不应与coverage插件一起使用,或在其他任何情况下重新加载模块可能会产生不良副作用的情况。[NOSE_WITH_ISOLATION]

-d, --detailed-errors, --failure-detail
通过尝试评估失败的断言,将详细信息添加到错误输出中[NOSE_DETAILED_ERRORS]

--with-profile
启用插件配置文件:使用此插件可以使用热点分析器运行测试。[NOSE_WITH_PROFILE]

--profile-sort=SORT
设置分析器输出的排序顺序

--profile-stats-file=FILE
Profiler统计文件;默认是每次运行时都有一个新的临时文件

--profile-restrict=RESTRICT
限制分析器输出。有关详细信息,请参见pstats的帮助。

--no-skip
禁用SkipTest异常的特殊处理。

--with-id
启用插件TestId:激活以将测试ID(如#1)添加到每个测试名称输出中。使用–failed激活,仅重新运行失败的测试。[NOSE_WITH_ID]

--id-file=FILE
将在测试运行中找到的测试ID存储在此文件中。默认值为工作目录中的.noseids文件。

--failed
运行在上次测试运行中失败的测试。

--processes=NUM
在这许多过程中进行传播测试。设置一个等于您计算机中处理器或内核数量的数字即可获得最佳效果。传递负数可将进程数自动设置为核心数。传递0表示禁用并行测试。除非设置了NOSE_PROCESSES,否则默认值为0。[NOSE_PROCESSES]

--process-timeout=SECONDS
设置超时以从每个测试运行器过程返回结果。默认值为10。[NOSE_PROCESS_TIMEOUT]

--process-restartworker
如果设置该选项,将在测试完成后重新启动每个工作进程,这有助于控制内存泄漏以免杀死系统。[NOSE_PROCESS_RESTARTWORKER]

--with-xunit
启用插件Xunit:此插件以标准XUnit XML格式提供测试结果。[NOSE_WITH_XUNIT]

--xunit-file=FILE
用于存储xunit报告的xml文件的路径。默认值为工作目录[NOSE_XUNIT_FILE]中的nasestests.xml。

--xunit-testsuite-name=PACKAGE
xunit xml中的测试套件的名称,由插件生成。默认测试套件名称是鼻子测试。

--xunit-prefix-with-testsuite-name
是否在被测类名的前面加上测试对象名。默认为false。

--all-modules
启用插件AllModules:从所有python模块收集测试。[NOSE_ALL_MODULES]

--collect-only
启用仅收集:仅收集和输出测试名称,请勿运行任何测试。[COLLECT_ONLY]

参考文献:
Testing with nose

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python】自动化测试框架--nose 的相关文章

  • 使用 psycopg2 在 python 中执行查询时出现“编程错误:语法错误位于或附近”

    我正在运行 Python v 2 7 和 psycopg2 v 2 5 我有一个 postgresql 数据库函数 它将 SQL 查询作为文本字段返回 我使用以下代码来调用该函数并从文本字段中提取查询 cur2 execute SELECT
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • STM32【复习串口】

    串口复习加深理解笔记 杂谈 USART FLAG TXE发送缓冲区空标志 说明可以往数据寄存器写入数据了 但并不代码数据发送完成了 USART FLAG TC发送完成标志 这个才是代表USART在缓冲区的数据发送完成了 即从机接收到了数据
  • 目标检测 获得的boundingbox 绘制并且保存

    可能我是读了一个假的研究生 这么简单的弄了3个小时 本来打算用现成的 可是一直保存不了 后面没办法自己写了一个 其中 VOC BBOX LABEL NAMES是list数组 保存对应的标签名 如果类别多的话可以用循环来写 我写在第二个代码上
  • SQL数据库创建失败,提示无法创建列出的某些文件名

    在学习SQL的时候出现了很多低级错误 如下 use master CREATE DATABASE SQL2012Db ON PRIMARY NAME Sql2012Data FILENAME E Program Files Microsof
  • Android总结之链式调用(方法链)

    前言 最近在学习总结Android属性动画的时候 发现Android的属性动画设计采用了链式调用的方式 然后又回顾了一下了以前接触的开源框架Glide也是采用链式调用的方式 还有最近火的一塌糊涂的RxJava也是采用链式调用 为何如此之多的
  • STM32---stm32f103c8t6与stm32f103zet6之间的代码移植转换

    目录 一 将c8t6转换为zet6 1 修改启动文件 2 修改芯片 3 将MD修改为HD 4 下载器的修改 5 修改完成 编译成功 二 将zet6转换为c8t6 一 将c8t6转换为zet6 1 修改启动文件 最终结果如下 2 修改芯片 将
  • RedHat8(RHEL8)超详细安装教程--图文解说版

    目录 一 RHEL8介绍 二 产品地址 三 安装 1 文件 gt 新建虚拟机 快捷键 Ctrl N 2 这里我们选择 自定义 即可 gt 下一步 3 兼容性 保持默认 gt 下一步 4 稍后安装 gt 下一步 5 选择 Linux 操作系统
  • OBJ转GLTF

    obj转gltf的方法较多 这里采用cesium 1 下载cesuim开发包 2 进入cesium根目录 npm下载obj2gltf 没有npm的 自行安装 npm install obj2gltf save 3 将 obj mlt等文件复
  • 数据挖掘学习

    文章目录 绪论 定义 挖掘过程 数据准备 数据探索EDA 数据仓库 空间数据库 时间数据库和时序数据库 流数据 异构数据和遗产数据 数据挖掘的模式 数据准备 数据组成 什么是数据对象 什么是数据属性 数据搜集 数据质量分析 数据类型 考点
  • 国产操作系统产业

    操作系统是计算机的灵魂 目前国外操作系统品牌几乎垄断了巨大的中国市场 其中在桌面端 移动端的市占率分别超过94 75 98 86 根据Gartner的统计数据 2018年中国的操作系统市场容量在189亿以上 其中国外操作系统品牌几乎在中国市
  • Gossip协议

    Gossip协议 一 Gossip协议 1 1 工作原理 1 2 Gossip优点 1 3 Gossip传播方式 1 3 1 Anti Entropy 反熵 1 3 2 Rumor Mongering 谣言传播 1 3 3 结合 1 4 G
  • 初识C语言(二)

    目录 五 字符串 六 转义字符 七 注释 7 1注释的类型 7 1 1单行注释 7 1 2多行注释 7 2注释的使用方法 7 2 1解释代码功能注释 7 2 2提供代码示例注释 7 2 3禁用或屏蔽代码 八 选择语句 8 1if语句 8 1
  • 利用python3自动在36kr里查找自己感兴趣的内容

    最近常常在36kr网站的快讯及资讯 最新里查看自己感兴趣内容的及时信息 由于快讯及资讯 最新里信息更新得比较及时快速 自己也很难一直盯着看 故想着要是写个脚本让其自动在后天挂着每隔5分钟查询一次 有的话就写入txt档中并在控制台打印出来 这
  • 小孩学创客编程好还是学机器人好

    小孩学创客编程好还是学机器人好 小孩的学习一直都是很多家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习的时候 可以说是十分的用心的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有
  • 域环境的搭建的详细教程-220109

    参考链接 https mp weixin qq com s src 11 timestamp 1641696209 ver 3547 signature zTIDZEcpq zjwuEuZpbaaAxFfkkVxcLHeX4AuKT78bJ
  • 第九届蓝桥杯 2018年省赛真题 (Java 大学C组 )

    蓝桥杯 2018年省赛真题 Java 大学C组 第一题 哪天返回 第二题 猴子分香蕉 第三题 字母阵列 第四题 第几个幸运数 第五题 书号验证 第六题 打印大X 第七题 缩位求和 第八题 等腰三角形 第九题 小朋友崇拜圈 第十题 耐摔指数
  • RHCE——DNS的正反向解析

    一 实验要求 DNS配置正反向解析 二 实验过程 1 安装软件包 root localhost ll yum install bind y 2 备份bind软件的的配置文件 root localhost yum repos d cp a e
  • CMAKE学习——编译多个文件 & 多个目录

    大型工程会有很多文件 包括类的实现和定义 各种不同的模块交叉在一起 我们怎么用cmake方便的编译呢 例如有这么一个工程 我们现在想要编译的话 如果只选择了main cpp 则会提示 未定义的引用 因为我们头文件和实现分离 但我们只包含了头
  • 【云原生之Docker实战】使用Docker部署jenkins持续集成工具

    云原生之Docker实战 使用Docker部署jenkins持续集成工具 一 jenkins介绍 1 jenkins简介 2 jenkins功能 3 jenkins基本工作图 二 检查本地系统版本 三 检查本地docker状态 1 检查do
  • IDEA运行报错:类文件具有错误的版本 55.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。

    IDEA运行报错 类文件具有错误的版本 55 0 应为 52 0 请删除该文件或确保该文件位于正确的类路径子目录中 如果搜索资料 会看到minor major版本 但其实不叫这个名字 Sun公司会在大的版本升级时增加major数字 小更新或
  • 【python】自动化测试框架--nose

    目录 一 准备 二 nose介绍 三 看个简单的例子了解下 三 nose常用命令简单介绍 1 查看所有nose相关命令 2 执行并捕获输出 3 提供XUnit XML 格式的测试结果 并存储在nosetests xml文件中 主要为jenk