问题
With the release of Rails 5.1, they included system tests. Which means we can test our JavaScript too in Rails. I see Rails guide explains a sample test creating article in both ways: via system test and via integration test.
Now the question is: before Rails 5.1 I was writing complex test cases in integration tests. But now I have two options to write a test case. I can write test case like
test: should create article
in integration test, but I can also write the same test case in system test.
So when should I choose system test to write a test case and when to choose integration tests ?
回答1:
The short answer has been given by MikDiet. For the long answer, check out the documentation on system and integration tests.
System tests allow for running tests in either a real browser or a headless driver for testing full user interactions with your application.
A quick rule of thumb is that all tests interacting with Javascript need to be run as system tests. But you could also use them to test your responsive layout, since you can specify the screen size of the browser.
Integration tests are used to test how various parts of your application interact. They are generally used to test important workflows within our application.
Integrations tests are different because they are not run through the browser. They still allow you to interact with the HTML of the result page, but remember that it's static output you work with.
In integration tests, you are mostly looking at the behavior of the controller actions and not so much on what the user sees and interacts with. This part of the documentation might help you understand what integration tests are all about: Functional Tests for Your Controllers.
回答2:
TL;DR: I would go with system tests instead of integration tests in any app I started today. The only advantage of integration tests is speed.
I think system tests have 2 great advantages over integration tests:
- They test interactions with real screens, instead of making synthetic requests for simulating those.
- They are much more realistic and comprehensive. For example, a broken piece of Javascript will make the spec fail, while it will be ignored in an integration test.
I think the only benefit of integration tests is speed. They are much faster indeed (check this experiment I made). For me, the speed difference is not such a big concern because:
- I can run isolated system tests in under 2s in my box. That is fast-enough feedback for my coding happiness.
- I rely on cloud test runners with parallelization for large suites.
I think both local and cloud speed and parallelization are good enough today, and will only get better with time. So I believe system tests is a much safer bet if you are starting a new app today.
来源:https://stackoverflow.com/questions/44690747/when-to-choose-system-test-over-integration-test-rails-5-1