Skip to main content

Command Palette

Search for a command to run...

Increasing test coverage with Antigravity & Gemini

Published
4 min read
Increasing test coverage with Antigravity & Gemini

AI tooling is resulting in a lot of code being written and you can also use it to write and expand test coverage. A few years ago, I wrote MetaRefCard, an app to help me map the complex controls of flight simulators like Elite Dangerous, Star Wars Squadrons and Microsoft Flight Simulator for my HOTAS (hands on throttle and stick) setup.

Over the years, I’ve maintained the codebase, mostly to update my dependencies in response to CVEs. I’ve recently been making these security changes using Antigravity and Gemini 3 Pro. I would manually test all these changes between releases.

Antigravity with Gemini gets you started quickly

MetaRefCard is written in Go which has excellent tooling for building & running tests. Antigravity and Gemini are able to utilise them very well.

To start, I asked Antigravity to build out a comprehensive set of tests. The result was a decent number of unit tests but I couldn't judge how comprehensive it was. Go’s testing framework can actually provide this data.

It’s easy to generate the output yourself.

ankur@:~/devel/metarefcard$ go test -coverprofile=coverage.out ./... && go tool cover -func=coverage.out
ok metarefcard              29.241s coverage: 0.0% of statements
ok metarefcard/mrc          0.584s  coverage: 0.0% of statements
ok metarefcard/mrc/common   0.003s  coverage: 1.3% of statements
ok metarefcard/mrc/fs2020   0.004s  coverage: 60.9% of statements
ok metarefcard/mrc/sws      0.011s  coverage: 77.3% of statements

main.go:13:               main                           0.0%
main.go:22:               parseCliArgs                   0.0%
mrc/common/devices.go:4:  LoadDevicesInfo                0.0%
mrc/common/game.go:40:    TitleCaser                     0.0%
mrc/common/game.go:86:    GameBindsAsString              0.0%
mrc/common/game.go:114:   Keys                           0.0%
mrc/common/image.go:17:   GenerateImages                 0.0%
mrc/common/image.go:69:   prepImgGenData                 0.0%
mrc/common/image.go:91:   populateImage                  0.0%
mrc/common/image.go:177:  decodeJpg                      0.0%
mrc/common/image.go:194:  measureString                  0.0%
mrc/common/image.go:201:  calcFontSize                   0.0%
mrc/common/image.go:250:  prepareContexts                0.0%
mrc/common/image.go:261:  getPixelMultiplier             0.0%
mrc/common/image.go:269:  drawTextWithBackgroundRec      0.0%
mrc/common/image.go:289:  addImageHeader                 0.0%
mrc/common/image.go:315:  addMRCLogo                     0.0%
mrc/common/logger.go:12:  Dbg                            0.0%
mrc/common/logger.go:17:  Msg                            0.0%
mrc/common/logger.go:24:  Err                            0.0%
mrc/common/logger.go:31:  Fatal                          0.0%
mrc/common/logger.go:36:  NewLog                         0.0%
mrc/common/model.go:10:   LoadGameModel                  0.0%
mrc/common/model.go:17:   FilterDevices                  0.0%
mrc/common/model.go:40:   GenerateContextColours         0.0%
mrc/common/model.go:66:   PopulateImageOverlays          0.0%
mrc/common/model.go:115:  GenerateImageOverlays          0.0%
mrc/common/util.go:18:    Keys                           100.0%
mrc/common/util.go:27:    LoadYaml                       0.0%
mrc/common/util.go:43:    YamlObjectAsString             0.0%
mrc/common/util.go:55:    loadFont                       0.0%
mrc/common/util.go:79:    loadFont                       0.0%
mrc/fs2020/fs2020.go:31:  GetGameInfo                    0.0%
mrc/fs2020/fs2020.go:36:  handleRequest                  0.0%
mrc/fs2020/fs2020.go:54:  loadInputFiles                 79.6%
mrc/fs2020/fs2020.go:234: matchGameInputToModel          0.0%
mrc/fs2020/fs2020.go:262: matchGameInputToModelByRegex   43.6%
mrc/metarefcard.go:36:    GetServer                      0.0%
mrc/metarefcard.go:94:    loadLocalFiles                 0.0%
mrc/metarefcard.go:106:   loadFormFiles                  0.0%
mrc/metarefcard.go:131:   sendResponse                   0.0%
mrc/metarefcard.go:195:   String                         0.0%
mrc/metarefcard.go:200:   Set                            0.0%
mrc/metarefcard.go:206:   GetFilesFromDir                0.0%
mrc/sws/sws.go:31:        GetGameInfo                    0.0%
mrc/sws/sws.go:36:        handleRequest                  0.0%
mrc/sws/sws.go:52:        loadInputFiles                 86.5%
mrc/sws/sws.go:181:       addAction                      100.0%
mrc/sws/sws.go:207:       getInputTypeAsField            85.7%
mrc/sws/sws.go:227:       interpretInput                 66.7%
mrc/sws/sws.go:302:       matchGameInputToModel          0.0%
total:                    (statements)                   29%

The initial test coverage wasn’t great at 29% but it was clear which files and functions had less coverage.

Guiding the model to expand coverage

One of the nice things about Go’s testing coverage report is that it can tell you test coverage per function. This way, I could see where my testing gaps were. I started asking Antigravity to increase coverage overall and when that had diminishing returns, I asked to increase coverage of specific functions.

I had to guide the process much more and ask questions about why it couldn’t go higher. This is a modern way of agentic engineering where my focus wasn’t on each line of code but instead it was about guiding the outcome.

Completing test coverage

Using this technique, I spent the next couple of hours having Antigravity eventually get my test coverage to 99.7%, with the only code not covered by unit tests being the main function. Again, this required back and forth with the tool.

I’m really satisfied with where I ended up. In a few hours, I had a very comprehensive test suite and felt a lot more confident to automatically make changes in the future.

If you’ve got a codebase that could do with additional test coverage, it’s easy to get started with Antigravity.

More from this blog

Software Testing with Antigravity & Gemini