Skip to main content

Code Smells and Refactoring


Knowing or unknowingly we all introduce code smell in our test automation code and thus I feel that after every 3-4 sprints, there should be a dedicated sprint for Refactoring for our test automation code. It's a very important part of any software development and thus we should constantly review our code for bad design and try to chuck out any kind of code smell.

Code Smells:
Code smells and anti-patterns are usually not bugs and they do not currently prevent the program from functioning. In-fact, they indicate poor design and implementation in software that may be increasing the risk of failures in the future. And thus these are technical debt.

Refactoring:
Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure — Martin Fowler


Here are the common causes of Code smells:

1) Comments
If you feel like writing comments for all the classes and methods, first try to refactor it as your code should be self-explanatory and self-documenting to the max-content. The naming convention should be strong- Names assigned to variables, methods, and classes should be clear and meaningful.

2) Large Classes
Large classes containing too many methods and properties are very hard to understand and maintain due to the complex structure.

3) Shotgun Surgery (Ripple effect) 
A change in one place requires us to alter many different classes.

4) Duplicated code
Same code structure in more than one place which in turn will also call the Ripple effect.

5) Incorrect locator strategy
Instead of the ones provided by a browser (Dev Tools) in the form of a "Copy full XPath", "Copy XPath", etc., use reliable locators such as id or name, etc. if possible otherwise write your own XPath.

6) Static waits
Hard-coded wait like thread.sleep lets the test pause for n number of seconds. It slows down your test execution time. Use smart waits like Explicit and Fluent as these wait for only the amount of time that is actually required.


Go through this insightful article by Mikhael Levkovsky to know more about Code smell:
https://hackernoon.com/5-easy-wins-to-refactor-even-the-worst-legacy-code-7vuc3069

Code climate is one such static quality analysis open-source project that analyzes your repositories from Github, BitBucket and other platforms and displays the number of Code Smells.

You can buy this book if you are interested in learning more about Refactoring:
https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599/ref=sr_1_1?keywords=Refactoring%3A+Improving+the+Design+of+Existing+Code&qid=1579624156&s=books&sr=1-1

Comments

Popular posts from this blog

How to Unzip files in Selenium (Java)?

1) Using Java (Lengthy way) : Create a utility and use it:>> import java.io.BufferedOutputStream; import org.openqa.selenium.io.Zip; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;   public class UnzipUtil {     private static final int BUFFER_SIZE = 4096;     public void unzip (String zipFilePath, String destDirectory) throws IOException {         File destDir = new File(destDirectory);         if (!destDir.exists()) {             destDir.mkdir();         }         ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));         ZipEntry entry = zipIn.getNextEntry();         // to iterates over entries in the zip folder         while (entry != null) {             String filePath = destDirectory + File.separator + entry.getName();             if (!entry.isDirectory()) {                 extractFile (zipIn, filePath);            

Encode/Decode the variable/response using Postman itself

We get a lot of use cases where we may have to implement Base64 encoding and/or decoding while building our APIs. And, if you are wondering if it is possible to encode/decode the variable/response using Postman itself or how to encode/decode the token or password in postman and save it in a variable? To Base64 encode/decode, the quickest way is to use JavaScript methods btoa, atob: atob - It turns base64-encoded ASCII data back to binary. btoa - It turns binary data to base64-encoded ASCII. Sample code : var responseBody = pm.response.json(); var parsedPwd = JSON.parse(atob(responseBody.password)); // presuming password is in the payload pm.collectionVariables.set("password", parsedPwd);

The use of Verbose attribute in testNG or POM.xml (maven-surefire-plugin)

At times, we see some weird behavior in your testNG execution and feel that the information displayed is insufficient and would like to see more details. At other times, the output on the console is too verbose and we may want to only see the errors. This is where a verbose attribute can help you- it is used to define the amount of logging to be performed on the console. The verbosity level is 0 to 10, where 10 is most detailed. Once you set it to 10, you'll see that console output will contain information regarding the tests, methods, and listeners, etc. <suite name="Suite" thread-count="5" verbose="10"> Note* You can specify -1 and this will put TestNG in debug mode. The default level is 0. Alternatively, you can set the verbose level through attribute in "maven-surefire-plugin" in pom.xml, as shown in the image. #testNG #automationTesting #verbose # #testAutomation