Ruby on Rails test coverage with simplecov
Clash Royale CLAN TAG#URR8PPP
Ruby on Rails test coverage with simplecov
I want to analyse the test coverage of our code , and therefore, installed the simplecov gem.
Our testing environement has 2 seperate project: REST API test (Java+Rest-Assured) and Web UI testing (Java-Selenium).
As you can see, we dont have unit testing inside the rails app, and we are testing using external projects.
I configured the simplecov gem as descriped in the tutorial and put this, in the rails script:
require 'simplecov'
SimpleCov.start 'rails'
puts "require simplecov"
When loading the app, I see the string I printed.
I ran both automation test projects, saw their printouts in the rails log, but I don't see any coverage of controllers/models, I see only small precentage of initializtion files of some gems and rails.
I searched the net, and tried putting the code phrase in boot.rb or even puma.rb and it returned the same results.
Any ideas?
EDIT
Nothing helped with all the comments, but I figured out something very interesting, in all cases, I only see the name of methods marked as tested, not the content (in controllers).
I tried to put the simplecov start phrase in both bin/rails, puma.rb, config.ru, environment.rb, all not given the desired results of code coverage.
Looking for an answer drawing from credible and/or official sources.
Our puma is running single threaded, also, what you shared about the ruby lib seems to be as per class, which can be very tough to control
– YogevAbr
Aug 23 at 7:50
I dont understand " and we are testing using external projects. "
– Simon Franzen
Aug 26 at 21:32
@SimonFranzen Tests are not rails unit tests, but using external projects like selenium and rest-assured.
– YogevAbr
Aug 27 at 9:42
Then I am not sure, how SimpleCov can track those tests and the coverage.
– Simon Franzen
Aug 27 at 10:32
3 Answers
3
I'm not sure simplecov can measure the whole rails app coverage... But I googled something that you can attach as a rack middleware:
https://github.com/danmayer/coverband
And it's output is compatible with simplecov. So it looks like it could be useful in your case.
As you mentioned in your question you're using puma. I suspect that, since it's multi-threaded, it spawns a few rails apps and their simplecov output overwrites each other's results. I'd try with the single threaded server like webrick - but this may make your tests slower (depending on how the tests are fired up really) or try the coverband
gem.
coverband
Also - even if the server is single threaded - I'm not sure if each request would not overwrite simplecov
's output.
simplecov
Exactly what I was looking for!! Work like a charm! Cheers!!
– YogevAbr
20 hours ago
Maybe you have to specify the paths
require 'simplecov'
SimpleCov.start do
# add_filter '/admin/'
add_group "Models", "app/models"
add_group "Controllers", "app/controllers"
add_group "Lib", "lib/"
add_group "Helpers", "app/helpers"
end
With these paths I get 0/0 (100%) coverage, which is probably wrong.
– YogevAbr
2 days ago
@YogevAbr Have you tried using absolute paths, to make sure this isn't an issue about working directory? Like
add_group "Models", "/home/user/path/to/project/app/models"
– vmarquet
yesterday
add_group "Models", "/home/user/path/to/project/app/models"
You need to to start SimpleCov before loading any of your files, so put these lines as early as possible in your ruby entrypoint:
require 'simplecov'
SimpleCov.start
You could see an example in one of my repos here:
https://github.com/tareksamni/DockUp/blob/master/spec/spec_helper.rb
I do autoload
my ruby code after starting SimpleCov
. You need to the same as well:
autoload
SimpleCov
require 'simplecov'
SimpleCov.start
require './autoload'
I don't have a spec helper, as I don't running any tests using the rails environment, which file is loaded first with rails 5? you know?
– YogevAbr
yesterday
I think
config.ru
is the entry point to the rails app– Tarek N. Elsamni
yesterday
config.ru
Same results. I really start to think that I am wasting my time and it's a bug with simplecov.
– YogevAbr
yesterday
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
There are a couple of things that might go wrong here. First, you should run puma single-threaded. SimpleCov's multi-threading support is limited. Second, have you tried using SimpleCov's at_exit hook? It will help you find out when and where SimpleCov stop "recording" code execution coverage: github.com/colszowka/simplecov#customizing-exit-behaviour . Third, Ruby's coverage might provide everything you need already, so you don't need SimpleCov in the first place: ruby-doc.org/stdlib-2.5.0/libdoc/coverage/rdoc/Coverage.html I hope you find that helpful.
– knugie
Aug 22 at 21:13