Skip to main content

Agile Testing - A defense system from my team stories


Today, I love to tell you about my team story about testing. That started from no testing to extreme testing system.

 eXtreme Feedback Devices (https://jenkins.io/blog/2013/09/05/extreme-feedback-lamp-switch-gear-style/)
Guess what? That is really an exciting idea from the picture(no?). These devices can work with Jenkins. Whenever they build a Jenkins job, this system notifies instantly to developers the status of their system.


That is not 100% related to testing but somehow it is like our testing mindset. Because, in my team,  we call our testing system is a defense system :). There is no doubt that it is very hard for us to remember all features of our applications even which is developed for a long time. Like a document, tests help us make sure no features will be lost after changes such as adding new more features, fixing bugs or refactoring code.

That was the reason why we cared much about testing. It was really important for developing apps. Back then, we thought about how to test effectively.
Testing pyramid
The "testing pyramid" points out that basing on the efforts, the agility of detecting bugs and the running time, we chose what types of tests should be more concern. We mainly followed the above priority, unit test was the most concern.

Now, I am going to share about our problems that we already met and what our strategies were in order to overcome them.

Unit Test

We maintained several very old projects that contains no tests. We got a lot of bugs and we tried to fix them but the problem was no one knows these bugs will happen again or not. It looked like a non-stop loop for fixing bugs. Terrible!
Oh no!
That was a reason why we used unit test to make sure we wouldn't see the bugs already fixed again. Day by day, we practiced TDD and tried to improve our unit test a lot. We also used Hamcrest to make our testing code more readable.

Integration Test

In our application architecture, we called integration such as controller which was a place that contained the combination from business logic (be handled at Service layers), managing database (be handled at DAO layers) and user interfaces (UI) events.

Issue with mock at integration layer
With unit test, it makes sense that a layer can mock a tested layer. For example, DAOs is already covered and Services layer just mocks DAOs layer and just focus on testing its logic. We used Mockito to archive that.

However, some time our applications still work wrong even our unit tests are passed. Why? We figured out that the problem came from mocking when we integration a lot of things together. For instances, we have Services call DAOs, we mock DAOs when we test Services. Because we always assume the behavior of DAOs work correctly, we will soon get unexpected problems in Services if the implementation of DAOs is changed.

This issue led us to find a new type of test is more reasonable rather than unit test. We call it integration test. Here we simulated a real environment and work with real data connection instead of mocking.

GUI Test

We used Selenium in order to test behaviors of GUI such as GUI elements' validation and interaction. We faced to a problem that it takes time too much when running in multi-browsers manually. We found Sauce Labs can help us. It can work with Jenkins so we can automatically running our test as we want on cross platforms.

Selenium Grid (http://www.seleniumframework.com/intermediate-tutorial/what-is-selenium-grid/)
However, we met another problems with Sauce Labs that is very hard to match our Selenium browser drivers, our operation system (Window, Linux) versions with Sauce Labs provided options. We found a better way to go that is Selenium Grid. With Selenium Grid, we freely configure our browsers drivers and operation system versions, it has not only the same ability to Sauce Labs but also run faster thanks to local connection. Moreover, it is free. :)

Summary

Tests are very important for us to develop our applications. It likes our document and defense system. We should try to test as much as possible to reduce bugs and improve our products quality.

Yeah, that is all from my story. What about yours?

Comments

Popular posts from this blog

Styling Sort Icons Using Font Awesome for Primefaces' Data Table

So far, Primefaces has used image sprites for displaying the sort icons. This leads to a problem if we want to make a different style for these icons; for example, I would make the icon "arrow up" more blurry at the first time the table loading because I want to highlight the icon "arrow down". I found a way that I can replace these icons with Font Awesome icons. We will use "CSS Pseudo-classes" to achieve it. The hardest thing here is that we should handle displaying icons in different cases. There is a case both "arrow up" and "arrow down" showing and other case is only one of these icons is shown. .ui-sortable-column-icon.ui-icon.ui-icon-carat-2-n-s { background-image: none; margin-left: 5px; font-size: 1.1666em; position: relative; } .ui-sortable-column-icon.ui-icon.ui-icon-carat-2-n-s:not(.ui-icon-triangle-1-s)::before { content: "\f106"; font-family: "FontAwesome"; position: ...

The HelloWorld example of JSF 2.2 with Myfaces

I just did by myself create a very simple app "HelloWorld" of JSF 2.2 with a concrete implementation Myfaces that we can use it later on for our further JSF trying out. I attached the source code link at the end part. Just follow these steps below: 1. Create a Maven project in Eclipse (Kepler) with a simple Java web application archetype "maven-archetype-webapp". Maven should be the best choice for managing the dependencies , so far. JSF is a web framework that is the reason why I chose the mentioned archetype for my example. 2. Import dependencies for JSF implementation - Myfaces (v2.2.10) into file pom.xml . The following code that is easy to find from  http://mvnrepository.com/  with key words "myfaces". <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-api</artifactId> <version>2.2.10</version> </dependency> <dependency> <groupId>org.apache.myfaces.core<...

JSF, Primefaces - Invoking Application Code Even When Validation Failed

A use case I have a form which has requirements as follow: - There are some mandatory fields. - Validation is triggered when changing value on each field. - A button "Next" is enable only when all fields are entered. It turns to disabled if any field is empty. My first approach I defined a variable "isDisableNext" at a backend bean "Controller" for dynamically disabling/enabling the "Next" button by performing event "onValueChange", but, it had a problem: <h:form id="personForm"> <p:outputLabel value="First Name" for="firstName"/> <p:inputText id="firstName" value="#{person.firstName}" required="true"> <p:ajax event="change" listener="#{controller.onValueChange}" update="nextButton"/> </p:inputText> <p:outputLabel value="Last Name" for="lastName"/> <p:i...

Multiple Inheritance of State and Implementation

Today, I was just curious about why an enum can not extend anything else. I took a look on the Oracle document here , and I found the answer is below: "All enums implicitly extend java.lang.Enum. Because a class can only extend one parent (see Declaring Classes), the Java language does not support multiple inheritance of state (see Multiple Inheritance of State, Implementation, and Type), and therefore an enum cannot extend anything else." I have been learned of it before. But, wait a sec...! Why Java does not support multiple inheritance of state? Since I have worked with other programming languages like C++, I was able to make a class extend some other classes. The short answer is to avoid the issues of multiple inheritance of state .  I wonder if other programming languages have these below terms but Java does. Multiple inheritance of state It is the ability to inherit fields from multiple classes. There is a problem and Java avoids it. "For exa...

The Evolution of Team Collaboration

I n my point of view, if a team has a good collaboration, team members will achieve the following: To be more effective To make work more enjoyable I have been working for a company for nearly four years as an software developer. Working on various projects from maintaining existing systems to developing a substantial product resulted in me moving to new teams three times. Actually, my most stable team lasted only around three years.  Every time I've moved to a new team, I have a chance to work with new members and a new team culture again. Indeed, I realize that there is a process of developing the team collaboration which gets better time by time. I think it is an evolution ! Phase 1: Poorly collaborate For example, that is when the team members have the following issues: Only work on his/her area of expertise Don't communicate to others Be not confident to take on new challages Don't listen to other members. Subsequently, the team ha...