Cycle de développement

Cycle en cascade

Cycle en V

Agile

Types de tests

Origines

Origines

  • L'environnement de test SUnit   pour le langage Smalltalk => 1994

  • JUnit => 1997

  • xUnit : Ensemble des frameworks de tests unitaires

Avoir un retour rapide

Tester unitairement

Vérifier que le résultat = attentes

Sécuriser la maintenance

Documenter le code

CI / CD

(Continuous Integration / Continuous Deployment)

10 Commandements

10 Commandements

  • Un test unitaire doit être véritablement unitaire

  • Si une classe est difficile à tester, il est temps de faire du refactoring

  • Un test unitaire doit s’exécuter le plus rapidement possible != test d’intégration

  • Chouchoutez vos tests unitaires
    • Faites du refactoring sur leur code
    • Respectez les bonnes pratiques

  • Isolez les dépendances de la classe testée grâce à l’injection de dépendances.

10 Commandements

  • Ne testez qu’un comportement à la fois

  • Pensez à utiliser un framework de mocks pour injecter les dépendances sous forme de bouchons

  • Identifiez précisément les étapes setup, exercise, verify, teardown dans votre code

  • Ne vous concentrez pas sur une couverture de code à 100%

  • Ne développez pas vos tests unitaires « plus tard »

Mauvaises pratiques

  • Écrire du code incompréhensible dans les classes de test

  • Avoir des tests dépendants du temps

  • Négliger la vraie sémantique des types utilisés

  • Faire trop de tests

  • Faux-positifs

TDD (Test Driven Development)

TDD (Test Driven Development)

Intérêts

  • Préciser les spécifications du code

  • S'assurer que le code produit est testable unitairement

  • Peut s’utiliser avec l’XP (eXtreme programming)

Exemples

RUnit

foo <- function(x) {
    x <- x*x
    x <- 2*x
    return(x)
}
test.foo <- function() {
    checkTrue(is.numeric(foo(1:10)))
    checkEquals(length(foo(1:10)), 10)
    checkEqualsNumeric(foo(1), 2)
}

Scala

import collection.mutable.Stack
import org.scalatest._

class ExampleSpec extends FlatSpec with Matchers {

  "A Stack" should "pop values in last-in-first-out order" in {
    val stack = new Stack[Int]
    stack.push(1)
    stack.push(2)
    stack.pop() should be (2)
    stack.pop() should be (1)
  }

  it should "throw NoSuchElementException if an empty stack is popped" in {
    val emptyStack = new Stack[Int]
    a [NoSuchElementException] should be thrownBy {
      emptyStack.pop()
    } 
  }
}

Java


import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;

public class AppTest
{
    @Test
    public void testList()
    {
       List
                
                 list = Arrays.asList("test1","test2");
       Assert.assertEquals("test1",list.get(0));
    }
}
        
            

Javascript

import test from 'ava';

test('foo', t => {
	t.pass();
});

test('bar', async t => {
	const bar = Promise.resolve('bar');

	t.is(await bar, 'bar');
});
var assert = require('assert');
describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});

Tests Unitaires

By benjamin tourman

Tests Unitaires

  • 420