python代码覆盖工具Coverage.py

Python代码覆盖率工具Coverage.py:从原理到CI/CD集成实战 代码覆盖率是衡量软件测试完备性的核心指标,它通过统计测试执行过程中覆盖的代码行、分支或路径比例,来评估测试用例对源代码的覆盖程度。其工作原理主要基于代码插桩技术,在程序运行时动态注入跟踪探针,记录执行轨迹。这一技术对于提升代码质量、发现测试盲区、保障重构安全具有重要价值,广泛应用于单元测试、持续集成和代码审查等工程实践场景。本文以Python生态中广泛使用的Coverage.py工具为例,深入解析其行覆盖与分支覆盖的测量机制,并演示如何通过pytest集成、.coveragerc配置及CI/CD流水线集成, 阅读详情
Coverage.py is a tool for measuring code coverage of Python programs. It monitors your program, noting which parts of the code have been executed, then analyzes the source to identify code that could have been executed but was not.

Coverage measurement is typically used to gauge the effectiveness of tests. It can show which parts of your code are being exercised by tests, and which are not.

1. 安装

1)下载Windows版

https://pypi.python.org/pypi/coverage

需要在注册表中注册python,通知执行下面的register.py

注意:python 3中把_winreg改为winreg

import sys
 
from winreg import *
 
# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix
 
regpath = "SOFTWARE\\Python\\Pythoncore\\%s\\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\\Lib\\;%s\\DLLs\\" % (
    installpath, installpath, installpath
)
 
def RegisterPy():
    try:
        reg = OpenKey(HKEY_CURRENT_USER, regpath)
    except EnvironmentError as e:
        try:
            reg = CreateKey(HKEY_CURRENT_USER, regpath)
            SetValue(reg, installkey, REG_SZ, installpath)
            SetValue(reg, pythonkey, REG_SZ, pythonpath)
            CloseKey(reg)
        except:
            print ("*** Unable to register!")
            return
        print ("--- Python", version, "is now registered!")
        return
    if (QueryValue(reg, installkey) == installpath and
        QueryValue(reg, pythonkey) == pythonpath):
        CloseKey(reg)
        print ("=== Python", version, "is already registered!")
        return
    CloseKey(reg)
    print ("*** Unable to register!")
    #print "*** You probably have another Python installation!"
   
if __name__ == "__main__":
    RegisterPy()


2) easy_install coverage


2. 使用


命令行使用说明:

http://coverage.readthedocs.org/en/latest/cmd.html


Coverage.py command line usage

When you install coverage.py, a command-line script simply called coverage is placed in your Python scripts directory. To help with multi-version installs, it will also create either acoverage2 orcoverage3 alias, and acoverage-X.Y alias, depending on the version of Python you’re using. For example, when installing on Python 2.7, you will be able to usecoverage,coverage2, or coverage-2.7 on the command line.

Coverage.py has a number of commands which determine the action performed:

  • run – Run a Python program and collect execution data.
  • report – Report coverage results.
  • html – Produce annotated HTML listings with coverage results.
  • xml – Produce an XML report with coverage results.
  • annotate – Annotate source files with coverage results.
  • erase – Erase previously collected coverage data.
  • combine – Combine together a number of data files.
  • debug – Get diagnostic information.

Help is available with the help command, or with the --help switch on any other command:

$ coverage help
$ coverage help run
$ coverage run --help

Version information for coverage.py can be displayed with coverage --version.

Any command can use a configuration file by specifying it with the --rcfile=FILE command-line switch. Any option you can set on the command line can also be set in the configuration file. This can be a better way to control coverage.py since the configuration file can be checked into source control, and can provide options that other invocation techniques (like test runner plugins) may not offer. SeeConfiguration files for more details.

Execution

You collect execution data by running your Python program with the run command:

$ coverage run my_program.py arg1 arg2
blah blah ..your program's output.. blah blah

Your program runs just as if it had been invoked with the Python command line. Arguments after your file name are passed to your program as usual insys.argv. Rather than providing a file name, you can use the-m switch and specify an importable module name instead, just as you can with the Python-m switch:

$ coverage run -m packagename.modulename arg1 arg2
blah blah ..your program's output.. blah blah

If you want branch coverage measurement, use the --branch flag. Otherwise only statement coverage is measured.

You can specify the code to measure with the --source,--include, and--omit switches. SeeSpecifying source files for details of their interpretation. Remember to put options for run after “run”, but before the program invocation:

$ coverage run --source=dir1,dir2 my_program.py arg1 arg2
$ coverage run --source=dir1,dir2 -m packagename.modulename arg1 arg2

Coverage.py can measure multi-threaded programs by default. If you are using more exotic concurrency, with themultiprocessing,greenlet,eventlet, or gevent libraries, then coverage.py will get very confused. Use the --concurrency switch to properly measure programs using these libraries. Give it a value ofgreenlet,eventlet, or gevent.

By default, coverage.py does not measure code installed with the Python interpreter, for example, the standard library. If you want to measure that code as well as your own, add the-L (or--pylib) flag.

If your coverage results seem to be overlooking code that you know has been executed, try running coverage.py again with the--timid flag. This uses a simpler but slower trace method. Projects that use DecoratorTools, including TurboGears, will need to use--timid to get correct results.

If you are measuring coverage in a multi-process program, or across a number of machines, you’ll want the--parallel-mode switch to keep the data separate during measurement. SeeCombining data files below.

During execution, coverage.py may warn you about conditions it detects that could affect the measurement process. The possible warnings include:

  • “Trace function changed, measurement is likely wrong: XXX”

    Coverage measurement depends on a Python setting called the trace function. Other Python code in your product might change that function, which will disrupt coverage.py’s measurement. This warning indicate that has happened. The XXX in the message is the new trace function value, which might provide a clue to the cause.

  • “Module XXX has no Python source”

    You asked coverage.py to measure module XXX, but once it was imported, it turned out not to have a corresponding .py file. Without a .py file, coverage.py can’t report on missing lines.

  • “Module XXX was never imported”

    You asked coverage.py to measure module XXX, but it was never imported by your program.

  • “No data was collected”

    Coverage.py ran your program, but didn’t measure any lines as executed. This could be because you asked to measure only modules that never ran, or for other reasons.

  • “Module XXX was previously imported, but not measured.”

    You asked coverage.py to measure module XXX, but it had already been imported when coverage started. This meant coverage.py couldn’t monitor its execution.

Data file

Coverage.py collects execution data in a file called ”.coverage”. If need be, you can set a new file name with the COVERAGE_FILE environment variable. This can include a path to another directory.

By default, each run of your program starts with an empty data set. If you need to run your program multiple times to get complete data (for example, because you need to supply disjoint options), you can accumulate data across runs with the-a flag on the run command.

To erase the collected data, use the erase command:

$ coverage erase

Combining data files

If you need to collect coverage data from different machines or processes, coverage.py can combine multiple files into one for reporting.

Once you have created a number of these files, you can copy them all to a single directory, and use thecombine command to combine them into one .coverage data file:

$ coverage combine

You can also name directories or files on the command line:

$ coverage combine data1.dat windows_data_files/

Coverage.py will collect the data from those places and combine them. The current directory isn’t searched if you use command-line arguments. If you also want data from the current directory, name it explicitly on the command line.

When coverage.py looks in directories for data files to combine, even the current directory, it only reads files with certain names. It looks for files named the same as the data file (defaulting to ”.coverage”), with a dotted suffix. Here are some examples of data files that can be combined:

.coverage.machine1
.coverage.20120807T212300
.coverage.last_good_run.ok

The run --parallel-mode switch automatically creates separate data files for each run which can be combined later. The file names include the machine name, the process id, and a random number:

.coverage.Neds-MacBook-Pro.local.88335.316857
.coverage.Geometer.8044.799674

If the different machines run your code from different places in their file systems, coverage.py won’t know how to combine the data. You can tell coverage.py how the different locations correlate with a[paths] section in your configuration file. See[paths] for details.

If any data files can’t be read, coverage.py will print a warning indicating the file and the problem.

Reporting

Coverage.py provides a few styles of reporting, with the report,html,annotate, andxml commands. They share a number of common options.

The command-line arguments are module or file names to report on, if you’d like to report on a subset of the data collected.

The --include and--omit flags specify lists of file name patterns. They control which files to report on, and are described in more detail inSpecifying source files.

The -i or --ignore-errors switch tells coverage.py to ignore problems encountered trying to find source files to report on. This can be useful if some files are missing, or if your Python execution is tricky enough that file names are synthesized without real source files.

If you provide a --fail-under value, the total percentage covered will be compared to that value. If it is less, the command will exit with a status code of 2, indicating that the total coverage was less than your target. This can be used as part of a pass/fail condition, for example in a continuous integration server. This option isn’t available forannotate.

Coverage summary

The simplest reporting is a textual summary produced with report:

$ coverage report
Name                      Stmts   Miss  Cover
---------------------------------------------
my_program.py                20      4    80%
my_module.py                 15      2    86%
my_other_module.py           56      6    89%
---------------------------------------------
TOTAL                        91     12    87%

For each module executed, the report shows the count of executable statements, the number of those statements missed, and the resulting coverage, expressed as a percentage.

The -m flag also shows the line numbers of missing statements:

$ coverage report -m
Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program.py                20      4    80%   33-35, 39
my_module.py                 15      2    86%   8, 12
my_other_module.py           56      6    89%   17-23
-------------------------------------------------------
TOTAL                        91     12    87%

If you are using branch coverage, then branch statistics will be reported in the Branch and BrPart (for Partial Branch) columns, the Missing column will detail the missed branches:

$ coverage report -m
Name                      Stmts   Miss Branch BrPart  Cover   Missing
---------------------------------------------------------------------
my_program.py                20      4     10      2    80%   33-35, 36->38, 39
my_module.py                 15      2      3      0    86%   8, 12
my_other_module.py           56      6      5      1    89%   17-23, 40->45
---------------------------------------------------------------------
TOTAL                        91     12     18      3    87%

You can restrict the report to only certain files by naming them on the command line:

$ coverage report -m my_program.py my_other_module.py
Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program.py                20      4    80%   33-35, 39
my_other_module.py           56      6    89%   17-23
-------------------------------------------------------
TOTAL                        76     10    87%

The --skip-covered switch will leave out any file with 100% coverage, letting you focus on the files that still need attention.

Other common reporting options are described above in Reporting.

HTML annotation

Coverage.py can annotate your source code for which lines were executed and which were not. Thehtml command creates an HTML report similar to thereport summary, but as an HTML file. Each module name links to the source file decorated to show the status of each line.

Here’s a sample report.

Lines are highlighted green for executed, red for missing, and gray for excluded. The counts at the top of the file are buttons to turn on and off the highlighting.

A number of keyboard shortcuts are available for navigating the report. Click the keyboard icon in the upper right to see the complete list.

The title of the report can be set with the title setting in the[html] section of the configuration file, or the--title switch on the command line.

If you prefer a different style for your HTML report, you can provide your own CSS file to apply, by specifying a CSS file in the[html] section of the configuration file. See[html] for details.

The -d argument specifies an output directory, defaulting to “htmlcov”:

$ coverage html -d coverage_html

Other common reporting options are described above in Reporting.

Generating the HTML report can be time-consuming. Stored with the HTML report is a data file that is used to speed up reporting the next time. If you generate a new report into the same directory, coverage.py will skip generating unchanged pages, making the process faster.

Text annotation

The annotate command produces a text annotation of your source code. With a-d argument specifying an output directory, each Python file becomes a text file in that directory. Without-d, the files are written into the same directories as the original Python files.

Coverage status for each line of source is indicated with a character prefix:

> executed
! missing (not executed)
- excluded

For example:

  # A simple function, never called with x==1

> def h(x):
      """Silly function."""
-     if 0:   #pragma: no cover
-         pass
>     if x == 1:
!         a = 1
>     else:
>         a = 2

Other common reporting options are described above in Reporting.

XML reporting

The xml command writes coverage data to a “coverage.xml” file in a format compatible withCobertura.

You can specify the name of the output file with the -o switch.

Other common reporting options are described above in Reporting.

Diagnostics

The debug command shows internal information to help diagnose problems. If you are reporting a bug about coverage.py, including the output of this command can often help:

$ coverage debug sys > please_attach_to_bug_report.txt

Two types of information are available: sys to show system configuration, anddata to show a summary of the collected coverage data.

The --debug option is available on all commands. It instructs coverage.py to log internal details of its operation, to help with diagnosing problems. It takes a comma-separated list of options, each indicating a facet of operation to log:

  • callers: annotate each debug message with a stack trace of the callers to that point.
  • config: before starting, dump all theconfiguration values.
  • dataio: log when reading or writing any data file.
  • dataop: log when data is added to the CoverageData object.
  • pid: annotate all debug output with the process id.
  • plugin: print information about plugin operations.
  • sys: before starting, dump all the system and environment information, as withcoverage debug sys.
  • trace: print every decision about whether to trace a file or not. For files not being traced, the reason is also given.

Debug options can also be set with the COVERAGE_DEBUG environment variable, a comma-separated list of these options.

The debug output goes to stderr, unless the COVERAGE_DEBUG_FILE environment variable names a different file, which will be appended to.


深入理解Python代码覆盖率工具:coverage.py 是一款用于测量 Python 代码覆盖率的工具。它可以帮助开发者了解哪些代码被执行了,哪些没有,从而提高代码质量,确保测试的有效性。通过分析执行的代码和未执行的代码来提供覆盖率报告,让开发者能够识别测试的盲区和潜在的错误。安装相当简单。推荐使用 pip 包管理器来安装:安装完成后,可以通过命令行来检查安装是否成功:代码覆盖率是一个指标,用于衡量在运行过程中被执行到的代码的百分比。主要有以下几个关键度量标准:语句覆盖率(Statement Coverage) 阅读详情

相关推荐

coveragepy:Python的代码覆盖率测量

Coverage.py 适用于Python的代码覆盖率测试。 Coverage.py通常在测试执行期间测量代码覆盖率。 它使用Python标准库中提供的代码分析工具和跟踪钩子来确定哪些行是可执行的,哪些行已执行。 Coverage.py可在许多版本的Python上运行: CPython 2.7。 CPython 3.5至3.10 alpha。 PyPy2 7.3.3和PyPy3 7.3.3。 文档在阅读文档中。 代码存储库和问题跟踪器位于GitHub上。 5.x中的新功能: SQLite数据存储,JSON报告,上下文,相对文件名,不再支持Python 2.6、3.3和3.4。 对于企业 作为Tidelift订阅的一部分提供。 Coverage和成千上万的其他软件包正在与Tidelift配合使用,以提供涵盖您使用的所有开源的一项企业订阅。 如果您想要开放源代码的灵活性

在Pycharm中安装PyQt5遇到的一些问题

在Pycharm中安装PyQt5遇到的一些问题

麦兜的博客 1221

养龙虾经验:OpenClaw用户必看的3个“省token”救命配置

本文分享了3个优化OpenClaw使用成本的配置方案:1)启用上下文压缩功能,可选择全局或单个代理设置,支持safeguard/adaptive两种压缩模式;2)修改SOUL.md提示词,要求模型回答简洁直接;3)限制对话历史长度。方案一效果最佳,可减少长对话的token消耗,但可能影响连贯性。三种方案可单独或组合使用,需根据实际场景调整参数。文章最后邀请读者分享使用痛点,将针对高频问题撰写解决方案。

wpplvhq的专栏 1416

pycharm内无法import已安装的模块

今天安装了几个模块,在cmd测试都正常,但是在pycharm就不行,后面试了以下方法: 1、 2、 3、选择python.exe 4、然后在回到settings截面就可以直接选择python安装目录下的python.exe

wujf90的博客 11万+

基于stm32的数控恒压恒流电源设计方案

基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 不包实物,可自己动手制作,可代做 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特

m0_72265581的博客 7217

域格4G网优模块获取

1、获取当前小区信息 接口说明 该命令用于获取当前小区信息。 语法结构 命令类型 格式 返回结果 Execute AT+SCELLINFO +SCELLINFO: <cellMode>,<mcc>,<mnc>,<lac>,<cellId>,<afrcn>,<cpi>,<rxLevel>

自由的幻想 2462

关于Django is not importable in this environment的解决方法

1、首先,安装Django:File/Settings/Project Interpreter 2、show all 3、 4、勾选Inherit global site-packages 5、apply/ok

weixin_37858031的博客 7589

【实战解析】Ubuntu双网卡冲突:如何解决同一网段下网关无法访问及上网问题

本文深入解析Ubuntu服务器双网卡配置在同一网段时引发的路由冲突问题,导致网关无法ping通及无法上网。通过分析路由表与Metric值原理,提供使用route命令调整优先级及修改Netplan配置文件的实战解决方案,确保主次路由明确,一劳永逸解决网络冲突。

f9g0h的博客 280

PyDev for Eclipse 简介

PyDev for Eclipse 是一个功能强大且易用的 Eclipse Python IDE 插件。本文将向读者介绍 PyDev 开源项目及其安装配置方法,并在此基础上详细介绍如何利用 PyDev 插件把 Eclipse 变为功能强大且易用的 Python IDE,如何利用其进行 Python 程序的开发和调试。通过本文,读者不仅可以了解 PyDev 这个开源项目,更能深入了解如何应用 PyD

1507

erdas监督分类(二)

去云 用一张没有云的影像替代有云影像 构建aoi图层 将云和云影编码合并 重编码工作 在监督分类做的差不多以后(纠正无误,无明显错误),就要对监督分类图像进行重编码和颜色调整。 在中选中Recode,对原来分类的地物类别进行重编码,(为彻底修改,记得备份)选中一列,在New Value输入新的编码,依次编码后点击应用apply,即可实现。 这时的图像如果是全黑的或者只有一两类的颜色也没有关系,新的编码覆盖掉了原来的编码,但是颜色并没有改变才会这样。可以点击图像,右击...

weixin_58968530的博客 958

SPSS中的数据分析—信度效度检验【1】

前一段时间跟大家分享了好几篇关于EXCEL方面的数据分析知识,不知道大家都掌握得怎么样了。今天咱们换个口味,给大家讲一下关于SPSS中的数据分析——信度效度检验。 现阶段正处在毕业季阶段,很多同学可能都正在忙着去弄自己的论文和答辩(不知道大家在翟天临上热搜这个事情上有没有做出过一定贡献),很多时候我们在写论文答辩甚至于其他课题研究的时候都会选择用问卷这种形式来收集数据。最后我们只需要针对问卷所取...

小白数据营的博客 6万+

Python 代码覆盖率统计工具 coverage.py

Python 代码覆盖率统计工具 coverage.py

朝着梦想 渐行前进 2577

全网最强AI辅助课题申报教程!超详细流程拆解,助你快速提高课题申报成功率(附各部分高效提示词)

实验法要详细说明自变量、因变量、实验类型、实验过程、实验步骤、测量工具名称、被试取样方式、无关变量控制方法。这个部分就是让评审专家相信我们有能力把这个项目干成,写的时候要重点突出两块内容:第一是研究基础,包括你或团队在相关领域已有的研究成果,比如发表的论文、承担过的课题、获得过的奖励、相关研究经验等,要具体、有说服力;课题申报专门给我们留了一小节用来突出课题的创新之处,不管是研究角度、研究对象、研究方法,还是应用价值都可以提炼作为我们的创新点,最后的语气成果也要明确具体,且要和课题内容紧密相关。

智能AI让学术科研更容易 665

Python代码覆盖率工具:Coverage.py

Coverage.py是由Ned Batchelder开发的Python代码覆盖率测量工具,它能够监控Python程序的执行,记录哪些代码行被执行,并生成详细的覆盖率报告。该工具支持多种报告格式,包括终端输出、HTML、XML等,是Python开发者进行测试分析的首选工具。

blues_C的博客 1028

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python代码覆盖率测试_Python 代码覆盖率统计工具 coverage.py

coverage.py是一个用来统计python程序代码覆盖率的工具。它使用起来非常简单,并且支持最终生成界面友好的html报告。在最新版本中,还提供了分支覆盖的功能。官方网站:win32版本下载地址:或者通过easy-install来安装:easy_install coverage装好后,在c:\Python25\Scripts\(假设装在c盘)目录会有一个coverage.exe。通过这个ex...

weixin_39664998的博客 324

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python覆盖率统计原理_Python代码覆盖率统计工具coverage.py用法详解

1、安装coveragepip install coverage安装完成后,会在python环境下的\Scripts下看到coverage.exe;2、Coverage 命令行coverage run运行一个.py的文件方式:python test.py现在使用coverage执行.py的文件方式:coverage run test.py会自动生成一个覆盖率统计结果文件(data file):.c...

weixin_35797090的博客 1070

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python代码覆盖率工具_Python 代码覆盖率统计工具 coverage.py

coverage.py是一个用来统计python程序代码覆盖率的工具。它使用起来非常简单,并且支持最终生成界面友好的html报告。在最新版本中,还提供了分支覆盖的功能。官方网站:win32版本下载地址:或者通过easy-install来安装:easy_installcoverage装好后,在c:\Python25\Scripts\(假设装在c盘)目录会有一个coverage.exe。通过这个ex...

weixin_39914938的博客 178

Coverage.py:Python 代码覆盖率测量工具

Coverage.py 是 Python 生态中广泛使用的代码覆盖率工具,支持 Python 3.10-3.15 beta 和 PyPy3。它能追踪代码执行路径,生成详细的行和分支覆盖率报告,帮助开发者评估测试完整性。通过简单的命令行操作即可收集数据并生成文本或 HTML 格式报告,其中 HTML 报告会直观标注已覆盖和未覆盖的代码行。该工具兼容主流测试框架,采用 Apache 2.0 许可证开源,是 Python 项目测试覆盖率分析的标准解决方案。

nullpointer25的博客 317

python代码覆盖率测试_Python 测试代码覆盖率统计工具 coverage.py

$ coverage --versionCoverage.py, version 4.5.1 with C extensionDocumentation at https://coverage.readthedocs.io应用最关键核心的几个参数使用如下:1. run执行代码覆盖率统计,只需要通过coverage的run参数执行被统计代码即可。coverage run --source='.' m...

weixin_39990410的博客 115

Python代码覆盖工具coverage.py介绍

coverage.py,这个工具比较简单,我用easy_install安装的($ easy_install coverage),非常顺利。由于python不需要编译链接,所以这个工具使用非常简单。coverage run [options] your_cmd [cmd options]。 假如原来的运行的命令是: fact_compare.py -d result 需要收集代码覆盖信...

weixin_34407348的博客 419

python代码覆盖率怎么统计的_Python代码覆盖率统计工具coverage.py用法详解

1、安装coveragepip install coverage安装完成后,会在Python环境下的\Scripts下看到coverage.exe;2、Coverage 命令行coverage run运行一个.py的文件方式:python test.py现在使用coverage执行.py的文件方式:coverage run test.py会自动生成一个覆盖率统计结果文件(data file):.c...

weixin_39769406的博客 226

3大Python代码覆盖率工具终极对比:Coverage.py vs pytest-cov vs nose-cov

代码覆盖率是衡量软件测试质量的重要指标,它能帮助你了解测试用例对代码的覆盖程度。在Python生态中,Coverage.py、pytest-cov和nose-cov是三个最流行的代码覆盖率工具。本文将深入分析这三款工具的特性、优势和适用场景,帮助你选择最适合项目需求的工具。 [![代码覆盖率可视化](https://raw.gitcode.com/GitHub_Trending/aw/aweso

gitblog_00817的博客 1065
上一篇: webdriver+python 对三大浏览器的支持
下一篇: python编辑器sublime
zm_21
博客等级 码龄14年 147粉丝 73原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值