Tuesday, April 21, 2026
HomeiOS DevelopmentCode protection for Swift Package deal Supervisor primarily based apps

Code protection for Swift Package deal Supervisor primarily based apps

[ad_1]

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

Bitrise

The right way to take a look at utilizing SPM?

The Swift Package deal Supervisor lets you create standalone Swift purposes each on Linux and macOS. You may construct and run these apps and you’ve got the power to jot down unit exams to your codebase. Xcode ships with the XCTest framework, however it’s possible you’ll not know that that is an open supply library. It is accessible on each single platform the place you may set up Swift. This additionally signifies that you should use the very same assertion strategies from the framework that you just used to work with on iOS to unit take a look at your SPM package deal. 📦

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

mkdir "myProject" && cd $_


swift package deal init


swift package deal init --type=executable


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



swift take a look at


swift take a look at -l   #or `swift take a look at --list-tests`


swift take a look at --parallel


swift take a look at --parallel --num-workers 2



swift take a look at --filter myProjectTests.myProjectTests


The take a look at 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 take a look at, 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 take a look at, 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 take a look at, with 0 failures (0 surprising) in 0.070 (0.071) seconds



Processing take a look at outcomes

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

swift take a look at 2>&1 | testify
swift take a look at --filter myProjectTests.myProjectTests 2>&1 | testify


Sadly, you may’t use the –parallel flag on this case, as a result of in case you accomplish that you may solely get progress indication as an alternative of the ultimate take a look at consequence output. Thankfully, you may nonetheless filter exams, so you do not have to attend for every little thing.


The swift take a look at command returns the take a look at outcomes on the usual error, as an alternative of the usual output. That is why you must redirect the stderr into the stdout through the 2>&1 flag.


If every little thing went properly you may see a pleasant JSON output, identical to this one:


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

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

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

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



Enabling code protection knowledge

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

I consider that protection stories are extraordinarily helpful for your complete developer workforce. Mission managers can consult with the protection proportion if it involves software program high quality. The QA workforce may study protection stories & take a look at all of the remaining components or recommend new take a look at concepts for the builders. Programmers can remove many of the bugs by writing correct unit / UI exams for the applying. A protection report helps them to analyse what must be achieved as properly. Xcode has a built-in protection report web page, however you must allow stories first. You may obtain the very same factor with out utilizing Xcode, by merely offering an additional flag to the take a look at command:

swift take a look at --enable-code-coverage

Okay, that is high quality, however the place is my report? 🤔



The right way to show protection knowledge?

Thus far so good, you will have generated the code protection report information, however they’re nonetheless in a extremely complicated file format. You want another extra software with the intention to show them correctly.


sudo apt-get set up llvm


brew set up llvm

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

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

Now you’re prepared to make use of llvm-cov which is a part of the LLVM infrastructure. You may learn extra about it by working man llvm-cov, however I will present you find out how to show some primary protection report for the pattern challenge.


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|Exams" 
    -use-color

This command will generate the protection report to your exams, however provided that you’ve supplied the --enable-code-coverage flag throughout testing. You need to notice that these llvm-cov enter paths might fluctuate primarily based in your present system. In case you are 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 need to embrace the information out of your .construct & Exams listing, however you may specify your personal regex primarily based filter as properly. 🔍



Placing every little thing collectively

You do not need to fiddle with these parameters, proper? Neither do I. That is why I made a useful shell script that may determine every little thing primarily based on the present challenge. Save your self just a few 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|Exams" 
    -use-color


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



Filename            Areas    Missed Areas     Cowl   Features  Missed Features  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%

In fact in case you run this script on a challenge that has extra supply information & unit exams, it’s going to produce a greater report. 😜



Conclusion

Utilizing take a look at outcomes and protection knowledge is a pleasant option to present stories to different members in your workforce. By working these instructions on a steady integration server (like Bitrise), you may automate your complete workflow.


[ad_2]

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments