Unit-testing multithreaded applications - multithreading

Has anyone got any advice or know of any frameworks for unit-testing of multithreaded applications?

Do not unit test multithreaded applications. Refactor the code to remove coupling between work that is done in different threads. Then test it separately.

Typically you don't unit test the concurrency of multi threaded applications as the unit tests aren't dependable and reproducible - because of the nature of concurrency bugs its not generally possible to write unit tests that consistently either fail or succeed, and so unit tests of concurrent code generally don't make very useful unit tests.
Instead you unit test each single threaded components of your application as normal and rely on load testing sessions to identify concurrency issues.
That said, there are some experimental load testing frameworks for testing concurrent applications, such as Microsoft CHESS - CHESS repeatedly runs a given unit test and systematically explores every possible interleaving of a concurrent test. This makes your unit tests dependable and reproducible.
For the moment however CHESS is still experimental (and probably not usable with the JVM) - for now stick with load testing to weed out concurrency issues.

Try multithreadedTC
http://code.google.com/p/multithreadedtc/
http://code.google.com/p/multithreadedtc-junit4/

Related

Performance testing with Jest in context of CI/CD

We're using in our product Jest for Unit and Integration tests.
At the moment, we're searching for a solution to measure the duration of scenarios (Unit, API and E2E level) between two CI/CD builds, to see if code changes lead to performance decrease/increase.
There are solutions outside like JMeter and Gattling, but it feels not a right fit. On the one side, you have to write tests again that we already have written in Jest. And on the other side, these tools are more focused on Load, Scalability, Breakpoint, Stress testing etc. which feels a bit over dimensioned for our use case. (We're using completely serverless architecture, and we only want to know if code changes have an impact on performance)
So I was thinking if it's not maybe simply possible to utilize the Jest tests that we have already written, to measure also in some way the performance and compare it between CI/CD builds.
Do you know if there is some library or tool that could help me with that? Or do you have perhaps a complete different opinion, how to approach that?

Testing express application with mongodb

I have a question regarding the different tests for a node and specifically an express application.
I am new to node/express coming from a PHP background, so have a few questions.
I know about unit testing, using things like PHPUnit, so I have read about about Jest. My specific questions regarding jest and unit testing in an application like express. Is should I be breaking my code apart more? It currently is quite together my routes are basically where all my business logic is found. Which means it's difficult to unit test?
Then with something else like end to end testing, I am looking at testcafe. For this I am really unsure how to get past my authentication and furthermore how to test on my local machine, before pushing code to production.
Full disclosure, I have a CI setup to my main branch, so I am looking to implement these tests to stop me merging breaking code to my master branch and breaking the production site.
Personally I always prefer mocha.js for testing any node app. It specifies how many test cases are passing, generates a report for those which are not passing. Also it specifies the time required to execute a code segment.
I'm also relatively new to node. I use the same stack as you (Express + MongoDB), applying MVC pattern. In Java I used to write a lot of unit tests with Spock, but right now I focus mostly on integration testing.
In my opinion routes should not contain any logic. Try to move it to separate layer - services. This way you can focus on testing logic provided by them, instead of trying to test code hidden in your routes.
For testing I use mocha.js, chai and chai-http.
My approach is to set up test database and form my tests as a sequence of requests. There is no problem with testing authentication that way - just need to correctly set up db with some user data. If you want to cut off the dependencies like database, use sinon for stubbing and mocking.
The obvious downside of this approach is testing time, but you can split tests into unit and integration suites. Run your unit tests locally and integration tests in your CI pipelines.
I'm not sure if it's the best approach, but I'm positive about the effects. Learning new technology means refactoring a lot. I have changed the structure of my project multiple times, moving logic, extracting methods and classes etc. Integration tests assure me that I haven't broken the business logic, despite having changed what's in the black box. This kind of breaking changes would be way harder to maintain with unit tests.

Best practices for testing a web app based on http calls

I've built a web app that aggregates trading and blockchain data from several API's and displays them in a React frontend(node backend)
What is the best way to implement tests to check for data integrity or when there are issues?
I am extremely new to testing and would appreciate any guidance/direction. Have gone through several testing frameworks and libraries, and am kind of dumbfounded.
You don't really test apps for 'integrity' of data as you name it.
Especially when data comes from external (not your DB for example) sources.
If you own data, you can test DB integrity, but as you say that is not the case here.
What you do though is - write unit tests (functional, recursive, end2end tests too, but what you want to do will mostly be achieved by using unit tests).
Within tests, you basically provide all kinds of data to your app and check if results are what you expect them to be (both for working and breaking scenarios).
This way, you can be sure it works as you designed it.
If at one point somewhere in future, a bug is exposed or you find it yourself. Define precisely why the bug occurs and add test for it.
When after you fix code responsible for bug, all of your tests pass, you know you are good again.
As for libraries:
"Jest" https://jestjs.io/ is go-to library for many - it's for unit tests mostly.
Jasmine and Mocha are also popular choices.
For end to end testing check Testcafe - I recommend it.
https://github.com/DevExpress/testcafe
You should also test your API with Mocha, Chai, Supertest or Chakram.
This way, all layers of your app are covered and bugs can be spotted quicker.

Performance test vs Load test vs stress test

I am testing web application which has been built by REST api. I want to simulate my application performance test, load test and stress test. Now I would like to know what is the difference among Performance test, Load test, stress test.
Performance Testing - is a testing technique, it is not something you can apply to your web application directly. Performance testing is a sub-type of Non Functional testing and Load Testing and Stress Testing in their turns are lesser subsets of the Performance Testing.
Load Testing - when you basically test how does your application act under anticipated load, i.e. you expect 500 concurrent users the process of asseessment your application under that load would be the Load Testing
Stress Testing - revealing the application boundaries and breaking points, finding bottlenecks, etc. It allows to have the following questions answered:
what is the maximum capacity of the system
how many users it may handle providing reasonable response time
what is the component which breaks first
does the system recover when the load gets back to normal
See Why ‘Normal’ Load Testing Isn’t Enough for more detailed explanation.

Functional testing automation using javascript tools

I was looking for easily adoptable functional test (e2e) automation tools using javascript. I did some exploration and picked some (Mocha, Jasmine, nightwatch, and intern). It is mentioned commonly that Mocha, and Jasmine are used for unit test automation, and nightwatch/intern can be used for functional test automation (e2e).
I really don't understand the difference between these tools or what makes them to be categorized under functional or unit test tools? Can't Mocha or Jasmine be used for functional test automation?
Added to that, http://theintern.io/ compares the market leading javascript tools feature wise. "includes functional testing" feature is applicable only for intern and nightwatch. I need clarification that why the same cannot be done in Mocha/Jasmine. Need your expertise answers.
thanks
mani
Mocha and Jasmine are purely unit testing frameworks. They don’t come with any code that could be used for performing functional testing. You could cobble together something yourself, using Mocha or Jasmine as the basis for writing tests and then adding some additional WebDriver client library like Leadfoot, but you’d still need to figure out how to start and stop browsers, how to also run unit tests against your code in each of the browsers, how to run tests in parallel so it isn’t horribly slow (Mocha and Jasmine are both designed to only ever run one test at once), how to hook up to a cloud hosting provider using their software tunnels (if you want), and write and maintain all of that glue code yourself. Oh, and you lose all the other features that come with Intern, like integrated code coverage analysis, source map support, etc.
Intern provides all of this out of the box, and was actually designed with this sort of testing in mind, which means it will always work better than any solution you try to create yourself using some other library that wasn’t designed for the task at hand. This question is a lot like asking, “can’t I just write my own testing framework from scratch using plain JavaScript?”. Sure, you can do everything in plain JS. It doesn’t mean it’s a good idea, though.

Resources