1. 程式人生 > 其它 >GitHub 的 Action 接入 Stryker.NET 進行自動化測試單元測試魯棒性

GitHub 的 Action 接入 Stryker.NET 進行自動化測試單元測試魯棒性

假設有一個搗蛋的小夥伴加入了你的團隊,這個搗蛋的小夥伴喜歡亂改程式碼,請問此時的單元測試能否攔住這些逗比行為?如果不能攔住逗比行為,是否代表著單元測試有所欠缺,或者有某些分支邏輯沒有考慮到。本文將告訴大家的 Stryker.NET 就屬於這樣的一個搗蛋的小夥伴,這個工具將會在執行測試的時候亂改你的程式碼,看看你的單元測試是否能攔住這樣的行為。如果在亂改程式碼之後,單元測試依然是通過的,那證明單元測試沒有攔住此行為,說不定就需要改改單元測試了

假設有一個搗蛋的小夥伴加入了你的團隊,這個搗蛋的小夥伴喜歡亂改程式碼,請問此時的單元測試能否攔住這些逗比行為?如果不能攔住逗比行為,是否代表著單元測試有所欠缺,或者有某些分支邏輯沒有考慮到。本文將告訴大家的 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://blog.lindexi.com/


本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯絡](mailto:[email protected])。