# Code Smell 52 - Fragile Tests

*Tests are our safety nets. If we don't trust on their integrity, we will be in great danger.*

> TL;DR: Don't write non-deterministic tests.

# Problems

* Determinism
    
* Confidence loss
    
* Wasted time
    

# Solutions

1. Test should be in full control. There should be no space for erratic behavior and degrees of freedom.
    
2. Remove all tests coupling.
    

%[https://maximilianocontieri.com/coupling-the-one-and-only-software-design-problem] 

# Examples

* Fragile, Intermittent, Sporadic or Erratic tests are common in many organizations.
    

Nevertheless, they mine the developers trust.

We must avoid them.

# Sample Code

## Wrong

```java
import static org.junit.Assert.assertEquals;

import org.junit.Test;

import components.set.Set;
import components.set.Set1L;

public abstract class SetTest {
 
    protected abstract Set<String> constructor();
   
    @Test
    public final void testAddEmpty() {
        Set<String> s = this.constructor();
        s.add("green");
        s.add("blue");
        assertEquals("{green. blue}", s.toString());
       //This is fragile since it dependes on set sort (which is not defined)
    }   
}
```

## Right

```java
import static org.junit.Assert.assertEquals;

import org.junit.Test;

import components.set.Set;
import components.set.Set1L;

public abstract class SetTest {
 
    protected abstract Set<String> constructor();
   
    @Test
    public final void testAddEmpty() {
        Set<String> s = this.constructor();
        s.add("green");
        assertEquals("{green}", s.toString());
    }   

    @Test
    public final void testEntryAtSingleEntry() {
        Set<String> s = this.createFromArgs("red");
        Boolean x = s.contains("red");
        assertEquals(true, x);
    } 
}
```

# Detection

Detection can be done with test run statistics.

It is very hard to put some test in maintenance since we are removing a safety net.

# More Info

%[https://softwareengineering.stackexchange.com/questions/109703/how-to-avoid-fragile-unit-tests] 

# Relations

%[https://maximilianocontieri.com/code-smell-76-generic-assertions] 

# Tags

* Coupling
    
* Determinism
    

# Conclusion

Fragile tests show system coupling and not deterministic or erratic behavior.

Developers spend lots of time and effort fighting against these false positives.

# Credits

Photo by [Jilbert Ebrahimi](https://unsplash.com/@jilburr) on [Unsplash](https://unsplash.com/s/photos/glass-broken)

---

> The amateur software engineer is always in search of magic.

*Grady Booch*

%[https://maximilianocontieri.com/software-engineering-great-quotes] 

---

This article is part of the CodeSmell Series.

%[https://maximilianocontieri.com/how-to-find-the-stinky-parts-of-your-code] 

*Last update: 2021/06/12*
