Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get around memory error with karma & phantomjs

Tags:

We're running tests using karma and phantomjs Last week, our tests mysteriously started crashing phantomJS with an error of -1073741819.

Based on this thread for Chutzpah it appears that code indicates a native memory failure with PhantomJS.

Upon further investigation, we are consistently seeing phantom crash around 750MB of memory.

Is there a way to configure Karma so that it does not run up against this limit? Or a way to tell it to flush phantom?

We only have around 1200 tests so far. We're about 1/4 of the way through our project, so 5000 UI tests doesn't seem out of the question.

like image 853
taylonr Avatar asked Dec 02 '14 00:12

taylonr


2 Answers

Thanks to the StackOverflow phenomenon of posting a question and quickly discovering an answer, we solved this by adding gulp tasks. Before we were just running karma start at the command line. This spun up a single instance of phantomjs that crashed when 750MB was reached.

Now we have a gulp command for each one of our sections of tests, e.g. gulp common-tests and gulp admin-tests and gulp customer-tests

Then a single gulp karma that runs each of those groupings. This allows each gulp command to have its own instance of phantom, and therefore stay underneath that threshold.

like image 124
taylonr Avatar answered Sep 27 '22 21:09

taylonr


We ran into similar issue. Your approach is interesting and certainly side steps the issue. However, be prepared to face it again later.

I've done some investigation and found the cause of memory growth (at least in our case). Turns out when you use:

   beforeEach(inject(SomeActualService)){ .... }

the memory taken up by SomeActualService does not get released at the end of the describe block and if you have multiple test files where you inject the same service (or other injectable objects) more memory will be allocated for it again.

I have a couple of ideas on how to avoid this: 1. create mock objects and never use inject to get real objects unless you are in the test that tests that module. This will require writing tons of extra code. 2. Create your own tracker (for tests only) for injectable objects. That way they can be loaded only once and reused between test files.

Forgot to mention: We are using angular 1.3.2, Jasmine 2.0 and hit this problem around 1000 tests.

like image 40
Simon N Avatar answered Sep 27 '22 21:09

Simon N