首页 文章 精选 留言 我的

精选列表

搜索[JavaScript库],共10000篇文章
优秀的个人博客,低调大师

图数据库 Nebula Graph 的代码变更测试覆盖率实践

对于一个持续开发的大型工程而言,足够的测试是保证软件行为符合预期的有效手段,而不是仅仅依靠 code review 或者开发者自己的技术素质。测试的编写理想情况下应该完全定义软件的行为,但是通常情况都是很难达到这样理想的程度。而测试覆盖率就是检验测试覆盖软件行为的情况,通过检查测试覆盖情况可以帮助开发人员发现没有被覆盖到的代码。 测试覆盖信息搜集 Nebula Graph 主要是由 C++ 语言开发的,支持大部分 Linux 环境以及 gcc/clang 编译器,所以通过工具链提供的支持,我们可以非常方便地统计Nebula Graph的测试覆盖率。 gcc/clang 都支持 gcov 式的测试覆盖率功能,使用起来也是非常简单的,主要有如下几个步骤: 添加编译选项 --coverage -O0 -g 添加链接选项 --coverage 运行测试 使用 lcov,整合报告,例如 lcov --capture --directory . --output-file coverage.info 去掉外部代码统计,例如 lcov --remove coverage.info '*/opt/vesoft/*' -o clean.info 到这里测试覆盖信息已经搜集完毕,接下可以通过 genhtml 这样的工具生成 html,然后通过浏览器查看测试覆盖率,如下图所示: 但是这样是非常不方便的,因为在持续的开发过程,如果每次都要手动进行这样一套操作,那必然带来极大的人力浪费,所以现在的常用做法是将测试覆盖率写入 CI 并且和第三方平台(比如 Codecov,Coveralls)集成,这样开发人员完全不必关心测试覆盖信息的收集整理和展示问题,只需要发布代码后直接到第三方平台上查看覆盖情况即可,而且现在的第三方平台也支持直接在 PR 上评论覆盖情况使得查看覆盖率的变更情况更加方便。 集成 CI Github Action 现在主流的 CI 平台非常多,比如 Travis,azure-pipelines 以及 GitHub Action 等。Nebula Graph 选用的是 GitHub Action,对于 Action 我们在之前的《使用 Github Action 进行前端自动化发布》这篇文章里已经做过介绍。 而 GitHub Action 相对于其他 CI 平台来说,有和 GitHub 集成更好,Action 生态强大简洁易用以及支持相当多的操作系统和 CPU 等优势。Nebula Graph 有关测试覆盖的 CI 脚本片段如下所示: - name: CMake with Coverage if: matrix.compiler == 'gcc-9.2' && matrix.os == 'centos7' run: | cmake -DENABLE_COVERAGE=ON -B build/ 可以看到这里我们将前文介绍的 coverage 相关的编译选项通过一个 cmake option 进行管理,这样可以非常方便地启用和禁止 coverage 信息的收集。比如在开发人员在正常的开发编译测试过程中通常不会开启这项功能以避免编译测试运行的额外开销。 - name: Testing Coverage Report working-directory: build if: success() && matrix.compiler == 'gcc-9.2' && matrix.os == 'centos7' run: | set -e /usr/local/bin/lcov --version /usr/local/bin/lcov --capture --gcov-tool $GCOV --directory . --output-file coverage.info /usr/local/bin/lcov --remove coverage.info '*/opt/vesoft/*' -o clean.info bash <(curl -s https://codecov.io/bash) -Z -f clean.info 这里主要是测试报告的收集、合并以及上传到第三方平台,这个在前文中已经比较详细地叙述过,CI 的运行情况如下图所示: 集成测试覆盖率平台 Codecov Nebula Graph 选择的测试覆盖平台是 Codecov——一个测试结果分析工具,对于 GitHub Action 而言,主要是在 CI 中执行上述的测试覆盖信息搜集脚本以及将最终的测试覆盖文件上传到 Codecov平台。 这里用户给自己的 repo 注册 Codecov 后可以获取一个访问的 token,通过这个 token 和 Codecov 的 API 可以将测试覆盖文件上传到 Codecov 这个平台上,具体的 API 可以参考https://docs.codecov.io/reference#upload,除了上传报告外还有列出 pr,commit 等 API 可以让用户开发自己的 bot 做一些自动化的工具,然后就可查看各种测试覆盖的信息,比如 Nebula Graph 的测试覆盖情况可以查看https://codecov.io/gh/vesoft-inc/nebula。 比如可以通过这个饼状图查看不同目录代码的覆盖情况: 也可以点开一个具体的文件,查看哪些行被覆盖那些行没有被覆盖: 当然我们一般不会直接使用 Codecov 的 API,而是使用他提供的一个 cli 工具,比如上传报告使用 bash <(curl -s https://codecov.io/bash) -Z -t <token> -f clean.info,这里的 token 就是 Codecov 提供的认证 token,一般来说作为环境变量 CODECOV_TOKEN 使用,而不是输入明文。 通过上述操作呢就可以在 Codecov 平台上查看你的工程的测试覆盖情况,并且可以看到每次 pr 增加减少了多少覆盖率,方便逐渐提高测试覆盖率。最后的话还可以在你的 README 上贴上 Codecov 提供的测试覆盖率 badge,就像 Nebula Graph 一样:https://github.com/vesoft-inc/nebula。 本文中如有错误或疏漏欢迎去 GitHub:https://github.com/vesoft-inc/nebula issue 区向我们提 issue 或者前往官方论坛:https://discuss.nebula-graph.com.cn/ 的 建议反馈 分类下提建议 👏;加入 Nebula Graph 交流群,请联系 Nebula Graph 官方小助手微信号:NebulaGraphbot 推荐阅读 应用 AddressSanitizer 发现程序内存错误 Github Statistics 一个基于 React 的 GitHub 数据统计工具 作者有话说:Hi,我是 shylock,是 Nebula Graph 的研发工程师,希望本文对你有所帮助,如果有错误或不足也请与我交流,不甚感激!

优秀的个人博客,低调大师

Kooteam 0.9.4 发布,新一代团队协作与知识库系统

Kooteam 是一款轻量级的在线团队协作工具,提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发等工具,并接入了企业微信,钉钉开放平台,使用便捷高效。 在线地址:https://www.kooteam.com 本次更新记录 + 新建任务,状态异常,不能完成的异常 + 项目统计,添加空数据提示 + 优化任务开始时间,结束时间配置 + 任务统计增加负责人信息 + 归档功能查看支持(New Feature) + 项目看板新增功能(New Feature) + 优化项目看板代码 + 子任务优化升级,支持指定负责人,计划时间等新特征 + 新增项目任务列表模块,支持各种条件过滤查看 + 新增项目甘特图模块,帮助项目管理者更好的规划项目 + 项目设置升级,支持任务分类,支持bug跟踪,需求跟踪 + 升级图片上传组件,增加智能压缩支持,提高上传体验与性能 + 升级身份验证规则,升级到fetch请求,禁用cookie 安装教程 https://www.kooteam.com/view.html?id=5e5893b9c687557cc87e38c3 升级方法: kooteam 安装目录下,执行 ./start.sh upgrade 脚本完成自动升级 Kooteam 功能截图 1. Markdown 编辑器 2) 在线思维导图工具 3. 可视化在线流程图工具 4) 工作四象限管理工具

优秀的个人博客,低调大师

图数据库 Nebula Graph RC4:支持 index,对接监控系统

本次 RC4 上线 INDEX功能,LOOKUP ON对建立索引的数据进行查询;RC4 提供了基于 SPACE层级的权限管理和 ACL 授权模式。在运维方面,新增 Nebula Stats Exporter对接基于 Grafana 和 Prometheus 的监视系统 功能 支持 INDEX 功能, CREATE INDEX创建索引,REBUILD INDEX,对已有数据重建索引,#1566, DROP INDEX删除已建索引#1776 新增 LOOKUP ON,对建立索引的数据进行查询 #1705, 当有索引时,Storage Engine 的插入性能#1738 提供基于 SPACE 层级的用户管理和权限控制,CREATE USER 创建用户,目前有 GOD、ADMIN 、 DBA 、 USER、GUEST 等5种角色权限。 GRANT ROLE 赋予某用户某权限, REVOKE ROLE 撤销已赋予给某用户的权限,#1842,#1873角色及其对应操作权限示例 #1929,#1917,在 nebula-graphd.conf 中 加入 --enable_authorize=true配置项,重启服务,使认证生效。 支持 TTL,允许用户指定数据的自动过期时间,#1584、#422,#1934 增强DELETE VERTEX, 支持批量删除点,删除操作支持 hash(), uuid() 函数 #1317、#1759 新增 Job Manager,管理存储层长时间运行的任务。目前已经支持 flush 和 compact。 SUBMIT JOB 提交 Job, STOP JOB 暂停任务,SHOW JOB返回 Job 详情, RECOVER JOB将失败的任务重新添加到执行队列中, #1424 GO查询支持BIDIRECT关键字,双向遍历#1740、#1752 支持 Reservoir Sampling, 返回"超级大点"指定数量的边,使用时在 storage 配置文件中设置 enable_reservoir_sampling 为 true 打开采样开关, max_edge_returned_per_vertex 配置采样数#1746、#1915 支持更多CHARSET 和COLLATION, SHOW CHARSET 、 SHOW COLLATION 可以查看到所支持的所有 CHARSET 和COLLATE。可在创建 Space 时设置, 默认的CHARSET 为utf8, 默认 COLLATE为utf8_bin#1709 OLAP Interface 新增 Spark 对接 Nebula Graph 的示例,#56 运维工具 利用 Helm 简化了 Nebula 在 Kubernetes 上的部署,#1473 新增 Nebula Stats Exporter ,采集 Nebula 集群监控和性能指标信息给 Prometheus,使用 Grafana 作为可视化组件https://github.com/vesoft-inc/nebula-stats-exporter/pull/2 Change 由于存储结构的变化,RC4 不兼容 commitID 43453a0 (2 月 6 日) 以前版本插入的数据。 文档迁移到 repo vesoft-inc/nebula-dochttps://github.com/vesoft-inc/nebula-docs Nebula Python Client ConnectionPool的初始化删除了 is_async参数,Python 暂不支持异步客户端。 RC3 升级 RC4 首先停止所有机器的 Nebula 服务 在每一台机器执行 scripts/nebula.service stop all 然后通过执行 scripts/nebula.service status all来确认进程已经退出 在每一台机器(根据系统环境)安装新的RPM包 获取 package:https://github.com/vesoft-inc/nebula/releases/tag/v1.0.0-rc4 安装 package:rpm -Uvh nebula-1.0.0-rc4.el7-5.x86_64.rpm 启动 Nebula 所有机器执行 scripts/nebula.service start all 确认进程正常启动 scripts/nebula.service status all 重新导入数据

优秀的个人博客,低调大师

clop v0.0.2 版本发布,golang 实现的命令行解析库

changlog #32fix 使用slice变量,默认进入贪婪模式 地址 https://github.com/guonaihong/clop https://gitee.com/guonaihong/clop clop clop 是一款基于struct的命令行解析器,麻雀虽小,五脏俱全。(从零实现) feature 支持环境变量绑定env DEBUG=xx ./proc 支持参数搜集cat a.txt b.txt,可以把a.txt, b.txt散装成员归归类,收集到你指定的结构体成员里 支持短选项proc -d或者长选项proc --debug不在话下 posix风格命令行支持,支持命令组合ls -ltr是ls -l -t -r简写形式,方便实现普通posix 标准命令 子命令支持,方便实现git风格子命令git add,简洁的子命令注册方式,只要会写结构提就行,3,4,5到无穷尽子命令也支持,只要你喜欢,用上clop就可以实现 默认值支持default:"1",支持多种数据类型,让你省去类型转换的烦恼 贴心的重复命令报错 严格的短选项,长选项报错。避免二义性选项诞生 效验模式支持,不需要写一堆的if x!= ""orif y!=0浪费青春的代码 内容 Installation Quick start example 1. How to use required tags 2.Support environment variables 3.Set default value 4. How to implement git style commands Implementing linux command options cat Installation go get github.com/guonaihong/clop Quick start package main import ( "fmt" "github.com/guonaihong/clop" ) type Hello struct { File string `clop:"-f; --file" usage:"file"` } func main() { h := Hello{} clop.Bind(&h) fmt.Printf("%#v\n", h) } // ./one -f test // main.Hello{File:"test"} // ./one --file test // main.Hello{File:"test"} example required flag package main import ( "fmt" "github.com/guonaihong/clop" ) type curl struct { Url string `clop:"-u; --url" usage:"url" valid:"required"` } func main() { c := curl{} clop.Bind(&c) } set default value 可以使用default tag设置默认值,普通类型直接写,复合类型用json表示 package main import ( "fmt" "github.com/guonaihong/clop" ) type defaultExample struct { Int int `default:"1"` Float64 float64 `default:"3.64"` Float32 float32 `default:"3.32"` SliceString []string `default:"[\"one\", \"two\"]"` SliceInt []int `default:"[1,2,3,4,5]"` SliceFloat64 []float64 `default:"[1.1,2.2,3.3,4.4,5.5]"` } func main() { de := defaultExample{} clop.Bind(&de) fmt.Printf("%v\n", de) } // run // ./use_def // output: // {1 3.64 3.32 [one two] [1 2 3 4 5] [1.1 2.2 3.3 4.4 5.5]} Support environment variables // file name use_env.go package main import ( "fmt" "github.com/guonaihong/clop" ) type env struct { OmpNumThread string `clop:"env=omp_num_thread" usage:"omp num thread"` Path string `clop:"env=XPATH" usage:"xpath"` Max int `clop:"env=MAX" usage:"max thread"` } func main() { e := env{} clop.Bind(&e) fmt.Printf("%#v\n", e) } // run // env XPATH=`pwd` omp_num_thread=3 MAX=4 ./use_env // output // main.env{OmpNumThread:"3", Path:"/home/guo", Max:4} subcommand package main import ( "fmt" "github.com/guonaihong/clop" ) type add struct { All bool `clop:"-A; --all" usage:"add changes from all tracked and untracked files"` Force bool `clop:"-f; --force" usage:"allow adding otherwise ignored files"` Pathspec []string `clop:"args=pathspec"` } type mv struct { Force bool `clop:"-f; --force" usage:"allow adding otherwise ignored files"` } type git struct { Add add `clop:"subcommand=add" usage:"Add file contents to the index"` Mv mv `clop:"subcommand=mv" usage:"Move or rename a file, a directory, or a symlink"` } func main() { g := git{} clop.Bind(&g) fmt.Printf("git:%#v\n", g) fmt.Printf("git:set mv(%t) or set add(%t)\n", clop.IsSetSubcommand("mv"), clop.IsSetSubcommand("add")) } // run: // ./git add -f // output: // git:main.git{Add:main.add{All:false, Force:true, Pathspec:[]string(nil)}, Mv:main.mv{Force:false}} // git:set mv(false) or set add(true) Implementing linux command options cat package main import ( "fmt" "github.com/guonaihong/clop" ) type cat struct { NumberNonblank bool `clop:"-c;--number-nonblank" usage:"number nonempty output lines, overrides"` ShowEnds bool `clop:"-E;--show-ends" usage:"display $ at end of each line"` Number bool `clop:"-n;--number" usage:"number all output lines"` SqueezeBlank bool `clop:"-s;--squeeze-blank" usage:"suppress repeated empty output lines"` ShowTab bool `clop:"-T;--show-tabs" usage:"display TAB characters as ^I"` ShowNonprinting bool `clop:"-v;--show-nonprinting" usage:"use ^ and M- notation, except for LFD and TAB" ` Files []string `clop:"args=files"` } func main() { c := cat{} err := clop.Bind(&c) fmt.Printf("%#v, %s\n", c, err) } /* Usage: ./cat [Flags] <files> Flags: -E,--show-ends display $ at end of each line -T,--show-tabs display TAB characters as ^I -c,--number-nonblank number nonempty output lines, overrides -n,--number number all output lines -s,--squeeze-blank suppress repeated empty output lines -v,--show-nonprinting use ^ and M- notation, except for LFD and TAB Args: <files> */

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册