How we ensure quality

Automated tests

We write automated tests that verify our code on several layers. Unit tests are used for small blocks of code. But testing individual classes is not enough, especially if they are heavily dependent on resources injected by a container. Also testing applications in a mock-up environment always leaves doors open to bugs that only appear in the real environment. That’s why besides unit tests we also apply integration tests which use Arquillian and run them within a real-life container.

Our team has made significant contributions to the Arquillian project which were very well received by the community.

Besides unit and integration tests that cover system internals we write automated user interface tests using such tools as JSFUnit, HtmlUnit, Warp, Graphene or Selenium.

When you write automated tests for your system you want to know how much of the code is covered by them. We use Jacoco, a great tool for measuring code coverage.

We enforce coding conventions to ensure that our code is clear, readable and maintainable. Checkstyle, PMD and Findbugs are our tools of choice for this.

Our QA process includes automated testing using Jenkins continuous integration server, which runs tests and QA checks after every commitment.

Manual tests

At the end of each development cycle called ‘iteration’ we update the beta server and perform careful, manual tests on all features created or modified recently, before our client has a chance to review them. Manual tests are needed to check if all requirements have been met and to see if implementation is in perfect accordance with project documentation. We also use manual testing to check how an application behaves in different browsers, operating systems and on various devices.

Regular code review

Even if software has no visible bugs and fulfills the client’s needs it doesn’t mean that its code is in perfect shape. That’s why our applications are regularly reviewed by the most experienced developers on our team to identify possible performance problems and to check the code for violations of programming conventions adopted by our company. This way we gain confidence that our solutions are efficient and highly maintainable.