假设有一个捣蛋的小伙伴加入了你的团队,这个捣蛋的小伙伴喜欢乱改代码,请问此时的单元测试能否拦住这些逗比行为?如果不能拦住逗比行为,是否代表着单元测试有所欠缺,或者有某些分支逻辑没有考虑到。本文将告诉大家的 Stryker.NET 就属于这样的一个捣蛋的小伙伴,这个工具将会在执行测试的时候乱改你的代码,看看你的单元测试是否能拦住这样的行为。如果在乱改代码之后,单元测试依然是通过的,那证明单元测试没有拦住此行为,说不定就需要改改单元测试了

大家都知道 GitHub 的 Action 可以非常方便将 dotnet tool 加入到工具链中,刚好 Stryker.NET 也是通过 dotnet tool 发布的,因此在 GitHub 的 Action 上接入十分简单

在 GitHub 的 Action 用上 Stryker.NET 就可以自动测试一下自己编写的单元测试的鲁棒性,看看单元测试是否能帮忙拦下一些不符合预期的行为变更。因为在开源项目中,单元测试很重要的一点在于,协助新加入的开发者了解自己编写的代码是否能在此开源项目中工作,可以认为新加入的开发者写的代码都是在乱改的情况下,单元测试能否帮忙拦下不符合预期的更改。如果不能拦下,那就是单元测试写的不够

我从张队长的博客看到了 .NET测试用例写的好不好?让变种来测试一下 这篇博客,了解到了 Stryker.NET 这个神奇的工具,于是在我的 AsyncWorkerCollection: 高性能的多线程异步工具库 中接入。本文接下来也使用此项目作为例子来告诉大家如何在 GitHub 的 Action 接入

开始之前,先聊一下 Stryker.NET 的原理,其实做法很简单,就是对现有的项目代码进行瞎改,例如将判断相等修改为判断不相等,在修改之后,再次执行单元测试,看看单元测试能否通过。如果单元测试依然通过,那证明单元测试没有考虑到此更改的行为。例如原先一个业务是需要判断相等的,但是被修改为判断不相等,此时单元测试居然还能过,那就证明单元测试没有考虑到从判断相等被改为判断不相等的行为

能被 Stryker.NET 更改的内容有很多,可以从 https://stryker-mutator.io/docs/stryker-net/Mutators 找到完全的功能。例如将加法修改为减法,将大于判断修改为小于判断,将字符串修改为空字符串等等

在开始接入 GitHub 的 Action 之前,先在自己本地测试一下

使用 AsyncWorkerCollection: 高性能的多线程异步工具库 作为例子,先进入单元测试所有的文件夹

cd test\AsyncWorkerCollection.Tests

按照惯例,使用 dotnet tool 的第一步就是安装工具,请使用如下代码进行安装

dotnet tool install -g dotnet-stryker

接着执行如下命令,让 Stryker.NET 自动测试

dotnet stryker -p="AsyncWorkerCollection.csproj" --log-file  -r "['html', 'progress']"

以上的核心命令就是 -p="AsyncWorkerCollection.csproj" 用来告诉 Stryker.NET 可以进行乱改代码的项目是哪个。执行上面代码之后,将会让 Stryker.NET 进行对 AsyncWorkerCollection.csproj 项目里面的代码乱改,在修改了代码之后,执行当前的单元测试,看看单元测试能否通过。如果单元测试不能通过了,那证明单元测试写的不错。大概的执行的输出如下

Killed:     8
Survived: 145
Timeout: 5

以上代码证明乱改的代码上,有 8 个乱改的代码被单元测试拦住,也就是被单元测试杀掉。而有 145 个乱改的代码能通过单元测试,证明单元测试其实和没有的差不多。剩下 5 个是在乱改之后单元测试超时了

接入到 GitHub 的 Action 也非常简单,只需要在 .github\workflows 文件夹里面再新建一个叫 stryker.yml 的文件即可。打开 stryker.yml 文件,添加自动测试的代码

name: Stryker

on:
push:
branches:
- master jobs:
Stryker:
runs-on: windows-latest
steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }} - name: Install Stryker
run: dotnet tool install -g dotnet-stryker - name: Test
run: |
cd test\AsyncWorkerCollection.Tests
dotnet stryker -p="AsyncWorkerCollection.csproj" --log-file -r "['html', 'progress']"

步骤十分简单,首先是只有在推送到 master 的时候才执行

on:
push:
branches:
- master

接着是将代码拉下

    steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}

然后安装工具和执行测试

      - name: Install Stryker
run: dotnet tool install -g dotnet-stryker - name: Test
run: |
cd test\AsyncWorkerCollection.Tests
dotnet stryker -p="AsyncWorkerCollection.csproj" --log-file -r "['html', 'progress']"

将此文件推送到 GitHub 上,合入 master 即可

详细更改请参考 https://github.com/dotnet-campus/AsyncWorkerCollection/pull/60


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性的更多相关文章

  1. 再探CI,Github调戏Action手记——自动构建并发布到另一仓库

    前言 接上文初探CI,Github调戏Action手记--自动构建并发布 在学习了Action的基本操作之后 接着我们来探索Action其他可能的功能 众所周知 只有用得到的技术学习的才会最快 我也是 ...

  2. 初探CI,Github调戏Action手记——自动构建并发布

    前言 最近在做脚本的说明文档时使用了vuepress这个东西 前端实在是菜,只能随便写写了 正常写完md文件之后推送至github做版本控制 而前端页面的生成则是在本地,部署也是在本地手工进行 一套下 ...

  3. 用 GitHub Action 构建一套 CI/CD 系统

    ​ 缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...

  4. 利用Github Action和.Net 5 自动执行米游社原神每日签到福利

    GenshinDailyHelper 原神的签到福利是需要单独下载APP进行才可以领取,并且每天需要打卡,虽然奖励并不是很可观,但有一些摩拉,食材和可观的经验书累计起来还是挺有吸引力的.可能本身不怎么 ...

  5. 利用.NET 5和Github Action 自动执行米游社原神每日签到福利

    背景 众所周知,原神的签到福利是需要下载app才可以领取的.但像我这种一般不怎么刷论坛的人,每天点开app签到很麻烦. 很多大佬利用Github的Action自动执行的模式,实现了很多好东西.加上.n ...

  6. 关于《Selenium3自动化测试实战--基于python语言》

    2016年1月,机缘巧合下我出版了<Selenium2自动化测试实战--基于python语言>这本书,当时写书的原因是,大部分讲Selenium的书并不讲编程语言和单元测试框,如果想在项目 ...

  7. Github自动打包并推送Nuget版本

    如何将自己的类库,自动打包并自动发布到Nuget? 1. 项目csproject属性修改 新建一个项目GitToNugetPackageTest 不用添加任何类,我们修改csproject属性. 替换 ...

  8. Azure应用服务+Github实现持续部署

    上次我们介绍了如何使用Azure应用服务(不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序).我们通过Visual studio新建一个项目后手动编译发布代码.然后通过F ...

  9. .netcore 急速接入第三方登录,不看后悔

    新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢. 如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下: https://oauthlogin.net/ 前言 此次带来得这个小 ...

  10. 利用github给国外文件下载加速

    前言 作为一名程序员,经常需要下载一些编程相关的环境,而国内的网络环境大家都知道,有的文件用浏览器是下载不动的,于是我有了利用github下载文件的想法. 我的demo项目地址:https://git ...

随机推荐

  1. AI金融预测领域综述文章筛选,附论文及代码链接,2021年版

    21年的综述最近读了3篇,总结笔记如下: (2021)Systematic Literature Review: Stock Price Prediction Using Machine Learni ...

  2. window.location.href和this.$router.push区别

    使用location.href='/url'来跳转,简单方便,但是刷新了页面:使用history.pushState('/url'),无刷新页面,静态跳转: 引进router,然后使用router.p ...

  3. parameter常数及常数函数的使用

    模型功能 常数在verilog设计中具备特殊的含义 一个可以由编译器进行处理的数 和C语言中常数一个不变的变量的作用不同 在verilog中,常数更多地作为预编译变量以提高设计的灵活性 在上一篇文章中 ...

  4. KingbaseES file_dw 介绍

    file_dw简介 ​ file_fdw模块提供外部数据包装器file_fdw, 它能被用来访问服务器的文件系统中的数据文件,或者在服务器上执行程序并读取它们的输出. 数据文件或程序输出必须是能够被C ...

  5. linux xfce 设置限制亮度滑块的最小亮度,在屏幕里的xfce设置亮度的最小亮度。

    参照 https://docs.xfce.org/xfce/xfce4-power-manager/preferences 使用代码 xfconf-query -c xfce4-power-manag ...

  6. mvn命令将 ueditor百度富文本编辑器 所需jar包上传到本地maven仓库

    1.需要的jar包位置 在解压后的路径中的jsp/lib下:(UEditor\jsp\lib) 2.打开命令行窗口 WIN+R 输入cmd并回车 直接在命令行输入如下命令:(一个一个输入运行,里面的路 ...

  7. 10 JavaScrit定时器

    10 JavaScrit定时器 在JS中, 有两种设置定时器的方案: // 语法规则 t = setTimeout(函数, 时间) // 经过xxx时间后, 执行xxx函数 // 5秒后打印我爱你 t ...

  8. #ST表,单调栈#洛谷 5648 Mivik的神力

    题目 分析 考虑答案应该是一段单调不下降的序列, 考虑预处理出每个点往后第一个大于这个点的位置, 那么答案应该是左端点到区间内最大的位置以及这个位置到右端点的贡献 那么区间最大的位置可以用ST表做,然 ...

  9. #后缀数组,单调队列#洛谷 2852 [USACO06DEC]Milk Patterns G

    题目 给定一个长度为\(n\)的字符串,求出现至少\(k\)次的最长子串长度 分析 由于后缀排序后的LCP才是最长的,既然要求至少\(k\)次, 实际上也就是维护长度为\(k\)的height数组最小 ...

  10. Mysql Order 排序的时候占用很长时间解决思路

    MySQL中的连表查询(JOIN)在进行ORDER BY排序时可能会变得很慢,尤其是当处理大量数据时.以下是一些优化策略,可以帮助减少排序操作的时间: 索引优化: 确保参与排序的列上有索引.如果排序的 ...