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

Creating a Chatbot with RiveScript in Java

Motivation "Artificial Intelligence (AI) is considered a major innovation that could disrupt many things. Some people even compare it to the Internet. A large investor firm predicted that some AI startups could become the next Apple, Google or Amazon within five years"   - Prof. John Vu, Carnegie Mellon University. Using chatbots to support our daily tasks is super useful and interesting. In fact, "Jenkins CI, Jira Cloud, and Bitbucket" have been becoming must-have apps in Slack of my team these days. There are some existing approaches for chatbots including pattern matching, algorithms, and neutral networks. RiveScript is a scripting language using "pattern matching" as a simple and powerful approach for building up a Chabot. Architecture Actually, it was flexible to choose a programming language for the used Rivescript interpreter like Java, Go, Javascript, Python, and Perl. I went with Java. Used Technologies and Tools Oracle JDK 1.8...

JSF 2 - Dynamically manipulating the component tree with system events

Let's suppose we want to modify the metadata (attributes)  of elements such as render , requried , maxlength but we do not define in JSF tags. The manipulating components can be conducted in Drools  files, for example. How could we do? I think that is what we need to change something of component tree during JSF life-cycle. JSF supports event handling throughout the JSF life-cycle. In this post, I use two events: postAddToView for scanning components tree and preRenderView for manipulating the meta of components before rendering to GUI. I modified my own project from previous post for this example. This is my first further JSF trying out with the project as I said before. :) We define the tags f:event below the form - a container component of the components which we want to work on. The valid values for the attribute type for f:event can be found from tag library document  of JSF 2. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" x...

Sharing a virtualenv across several Python projects using Pipenv

There is a standard library for all projects in Python. However, several projects don’t always have the same dependencies all the time. That is where virtual environments come to play. You can follow this official document to use two separated tools  virtualenv and pip to  fulfill that need. My preferred alternative is to use pipenv . Pipenv is easy to use and convenient. The following are my steps to make a shared virtualenv for my all projects which requires the same dependencies. Step 1. Create an isolated virtualenv. python -m venv my-shared-env Step 2. Create a symbolic link to the created virtualenv. cd project_1 ln -s ~/.local/share/virtualenvs/my-shared-env .venv I have encountered the following issue at step 1. FileNotFoundError: [Errno 2] No such file or directory: '{my_project_path}/.venv/bin/pip': '{my_project_path}/.venv/bin/pip' The root cause was I tried to create virtualenv by running pipenv install and renaming the generated virtualenv to ...

Regex - Check a text without special characters but German, French

Special characters such as square brackets ([ ]) can cause an exception " java.util.regex.PatternSyntaxException " or something like this if we don't handle them correctly. I had met this issue. In my case, my customers want our application should allow some characters in German and French even not allow some special characters. The solution is that we limit the allowed characters by showing the validation message on GUI. For an instance, the message looks like the following: "This field can't contain any special characters; only letters, numbers, underscores (_), spaces and single quotes (') are allowed." I used Regular Expression to check it. For entering Germany and French, I actually don't have this type of keyboard, so I referred these sites: * German characters: http://german.typeit.org/ * French characters: http://french.typeit.org/ Here is my code: package vn.nvanhuong.practice; import java.util.regex.Matcher; import java.util...

[Snippet] CSS - Child element overlap parent

I searched from somewhere and found that a lot of people says a basic concept for implementing this feature looks like below: HTML code: <div id="parent">  <div id="child">  </div> </div> And, CSS: #parent{   position: relative;   overflow:hidden; } #child{   position: absolute;   top: -1;   right: -1px; } However, I had a lot of grand-parents in my case and the above code didn't work. Therefore, I needed an alternative. I presumed that my app uses Boostrap and AngularJs, maybe some CSS from them affects mine. I didn't know exactly the problem, but I believed when all CSS is loaded into my browser, I could completely handle it. www.tom-collinson.com I tried to create an example to investigated this problem by Fiddle . Accidentally, I just changed: position: parent; to position: static; for one of parents -> the problem is solved. Look at my code: <div class="modal-body dn-placeholder-parent-positi...