假設有一個搗蛋的小伙伴加入了你的團隊,這個搗蛋的小伙伴喜歡亂改代碼,請問此時的單元測驗能否攔住這些逗比行為?如果不能攔住逗比行為,是否代表著單元測驗有所欠缺,或者有某些分支邏輯沒有考慮到,本文將告訴大家的 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 ),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布,如有任何疑問,請與我聯系,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292291.html
標籤:其他
上一篇:15-Docker 容器互聯實踐
