Code protection for Swift Package deal Supervisor based mostly apps

0/5 No votes

Report this app

Description

[ad_1]

Learn to collect and show code protection experiences in your Swift packages each for macOS and Linux with out utilizing Xcode in any respect.

Bitrise

How one can check utilizing SPM?

The Swift Package deal Supervisor means that you can create standalone Swift functions each on Linux and macOS. You possibly can construct and run these apps and you’ve got the flexibility to write down unit exams in your codebase. Xcode ships with the XCTest framework, however you might not know that that is an open supply library. It is obtainable on each single platform the place you may set up Swift. This additionally signifies that you should utilize the very same assertion strategies from the framework that you just used to work with on iOS to unit check your SPM bundle. 📦

Let me present you find out how to make a model new undertaking utilizing the Swift Package deal Supervisor:

mkdir "myProject" && cd $_


swift bundle init


swift bundle init --type=executable


Each the library and the executable template comprises a pattern check file with a dummy check case. You possibly can run exams in some ways, there’s built-in help for parallel execution (you may even specify the variety of staff), it’s also possible to filter what to run by check goal, check case or you may consider only one check. ✅



swift check


swift check -l   #or `swift check --list-tests`


swift check --parallel


swift check --parallel --num-workers 2



swift check --filter myProjectTests.myProjectTests


The check result’s going to look considerably like this:


Check Suite 'All exams' began at 2020-01-16 16:58:23.584
Check Suite 'myProjectPackageTests.xctest' began at 2020-01-16 16:58:23.584
Check Suite 'myProjectTests' began at 2020-01-16 16:58:23.584
Check Case '-[myProjectTests.myProjectTests testExample]' began.
Check Case '-[myProjectTests.myProjectTests testExample]' handed (0.070 seconds).
Check Suite 'myProjectTests' handed at 2020-01-16 16:58:23.654.
     Executed 1 check, with 0 failures (0 surprising) in 0.070 (0.070) seconds
Check Suite 'myProjectPackageTests.xctest' handed at 2020-01-16 16:58:23.655.
     Executed 1 check, with 0 failures (0 surprising) in 0.070 (0.071) seconds
Check Suite 'All exams' handed at 2020-01-16 16:58:23.655.
     Executed 1 check, with 0 failures (0 surprising) in 0.070 (0.071) seconds



Processing check outcomes

If that you must course of the end result of the testing, that may be fairly difficult. I’ve created a small software that may convert your check outcomes right into a JSON file. It is referred to as Testify, you may seize it from GitHub. Let me present you the way it works:

swift check 2>&1 | testify
swift check --filter myProjectTests.myProjectTests 2>&1 | testify


Sadly, you may’t use the –parallel flag on this case, as a result of for those who accomplish that you will solely get progress indication as an alternative of the ultimate check outcome output. Happily, you may nonetheless filter exams, so you do not have to attend for every thing.


The swift check command returns the check outcomes on the usual error, as an alternative of the usual output. That is why it’s a must to redirect the stderr into the stdout by way of the 2>&1 flag.


If every thing went properly you will see a pleasant JSON output, similar to this one:


{
  "endDate" : 602416925.25200009,
  "kids" : [
    {
      "endDate" : 602416925.25200009,
      "children" : [
        {
          "endDate" : 602416925.25200009,
          "children" : [

          ],
          "startDate" : 602416925.19000006,
          "circumstances" : [
            {
              "outcome" : "success",
              "className" : "myProjectTests",
              "moduleName" : "myProjectTests",
              "testName" : "testExample",
              "duration" : 0.062
            }
          ],
          "surprising" : 0,
          "end result" : "success",
          "title" : "myProjectTests"
        }
      ],
      "startDate" : 602416925.19000006,
      "circumstances" : [

      ],
      "surprising" : 0,
      "end result" : "success",
      "title" : "myProjectPackageTests.xctest"
    }
  ],
  "startDate" : 602416925.19000006,
  "circumstances" : [

  ],
  "surprising" : 0,
  "end result" : "success",
  "title" : "Chosen exams"
}



Enabling code protection knowledge

Code protection is a measurement of what number of traces/blocks/arcs of your code are executed whereas the automated exams are operating.

I consider that protection experiences are extraordinarily helpful for all the developer group. Undertaking managers can check with the protection proportion if it involves software program high quality. The QA group also can look at protection experiences & check all of the remaining components or recommend new check concepts for the builders. Programmers can eradicate many of the bugs by writing correct unit / UI exams for the appliance. A protection report helps them to analyse what must be finished as properly. Xcode has a built-in protection report web page, however it’s a must to allow experiences first. You possibly can obtain the very same factor with out utilizing Xcode, by merely offering an additional flag to the check command:

swift check --enable-code-coverage

Okay, that is tremendous, however the place is my report? 🤔



How one can show protection knowledge?

To this point so good, you’ve got generated the code protection report information, however they’re nonetheless in a very complicated file format. You want yet another further software with the intention to show them correctly.


sudo apt-get set up llvm


brew set up llvm

echo 'export PATH="/usr/native/choose/llvm/bin:$PATH"' >> ~/.zshrc

echo 'export PATH="/usr/native/choose/llvm/bin:$PATH"' >> ~/.bashrc

Now you might be prepared to make use of llvm-cov which is a part of the LLVM infrastructure. You possibly can learn extra about it by operating man llvm-cov, however I will present you find out how to show some primary protection report for the pattern undertaking.


llvm-cov report 
    .construct/x86_64-apple-macosx/debug/myProjectPackageTests.xctest/Contents/MacOS/myProjectPackageTests 
    -instr-profile=.construct/x86_64-apple-macosx/debug/codecov/default.profdata 
    -ignore-filename-regex=".construct|Assessments" 
    -use-color

This command will generate the protection report in your exams, however provided that you’ve supplied the --enable-code-coverage flag throughout testing. You must notice that these llvm-cov enter paths might differ based mostly in your present system. If you’re utilizing Linux, you need to merely give the xctest path as a parameter (e.g. .construct/x86_64-unknown-linux/debug/myProjectPackageTests.xctest on this case), the instrument profile is situated below the identical listing that is not a giant distinction, however nonetheless watch out with the platform title. Normally you do not wish to embrace the information out of your .construct & Assessments listing, however you may specify your personal regex based mostly filter as properly. 🔍



Placing every thing collectively

You do not wish to fiddle with these parameters, proper? Neither do I. That is why I made a helpful shell script that may work out every thing based mostly on the present undertaking. Save your self a couple of hours, right here is the ultimate snippet:




BIN_PATH="$(swift construct --show-bin-path)"
XCTEST_PATH="$(discover ${BIN_PATH} -name '*.xctest')"

COV_BIN=$XCTEST_PATH
if [[ "$OSTYPE" == "darwin"* ]]; then
    f="$(basename $XCTEST_PATH .xctest)"
    COV_BIN="${COV_BIN}/Contents/MacOS/$f"
fi

llvm-cov report 
    "${COV_BIN}" 
    -instr-profile=.construct/debug/codecov/default.profdata 
    -ignore-filename-regex=".construct|Assessments" 
    -use-color


You must put it aside as cov.sh or one thing related. Add some permissions by utilizing chmod +x cov.sh and you might be able to run it by merely getting into ./cov.sh. Your protection report will seem like this:



Filename            Areas    Missed Areas     Cowl   Capabilities  Missed Capabilities  Executed       Traces      Missed Traces     Cowl-------------------------------------------------------------------------------------------------------------------------------------
myProject.swift           3                 0   100.00%           3                 0   100.00%           8                 0   100.00%-------------------------------------------------------------------------------------------------------------------------------------
TOTAL                     3                 0   100.00%           3                 0   100.00%           8                 0   100.00%

After all for those who run this script on a undertaking that has extra supply information & unit exams, it’s going to produce a greater report. 😜



Conclusion

Utilizing check outcomes and protection knowledge is a pleasant solution to present experiences to different members in your group. By operating these instructions on a steady integration server (like Bitrise), you may automate your total workflow.


[ad_2]

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.