Ruby on Rails test coverage with simplecov

The name of the pictureThe name of the pictureThe name of the pictureClash 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.





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






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.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

How to determine optimal route across keyboard