mirror of
https://github.com/metabarcoding/obitools4.git
synced 2026-03-25 13:30:52 +00:00
441 lines
12 KiB
Markdown
441 lines
12 KiB
Markdown
|
|
# Tests automatisés pour obisuperkmer
|
|||
|
|
|
|||
|
|
## Vue d'ensemble
|
|||
|
|
|
|||
|
|
Des tests automatisés ont été créés pour la commande `obisuperkmer` dans le répertoire `obitests/obitools/obisuperkmer/`. Ces tests suivent le pattern standard utilisé par toutes les commandes OBITools et sont conçus pour être exécutés dans un environnement CI/CD.
|
|||
|
|
|
|||
|
|
## Fichiers créés
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
obitests/obitools/obisuperkmer/
|
|||
|
|
├── test.sh # Script de test principal (6.7 KB)
|
|||
|
|
├── test_sequences.fasta # Données de test (117 bytes)
|
|||
|
|
└── README.md # Documentation (4.1 KB)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Taille totale : ~11 KB
|
|||
|
|
|
|||
|
|
Cette taille minimale est idéale pour un dépôt Git et des tests CI/CD rapides.
|
|||
|
|
|
|||
|
|
## Jeu de données de test
|
|||
|
|
|
|||
|
|
### Fichier : `test_sequences.fasta` (117 bytes)
|
|||
|
|
|
|||
|
|
Le fichier contient 3 séquences de 32 nucléotides chacune :
|
|||
|
|
|
|||
|
|
```fasta
|
|||
|
|
>seq1
|
|||
|
|
ACGTACGTACGTACGTACGTACGTACGTACGT
|
|||
|
|
>seq2
|
|||
|
|
AAAACCCCGGGGTTTTAAAACCCCGGGGTTTT
|
|||
|
|
>seq3
|
|||
|
|
ATCGATCGATCGATCGATCGATCGATCGATCG
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Justification du choix
|
|||
|
|
|
|||
|
|
1. **seq1** : Motif répétitif simple (ACGT)
|
|||
|
|
- Teste l'extraction de super k-mers sur une séquence avec faible complexité
|
|||
|
|
- Les minimiseurs devraient être assez réguliers
|
|||
|
|
|
|||
|
|
2. **seq2** : Blocs homopolymères
|
|||
|
|
- Teste le comportement avec des régions de très faible complexité
|
|||
|
|
- Les minimiseurs varieront entre les blocs A, C, G et T
|
|||
|
|
|
|||
|
|
3. **seq3** : Motif différent (ATCG)
|
|||
|
|
- Teste la diversité des super k-mers extraits
|
|||
|
|
- Différent de seq1 pour vérifier la distinction
|
|||
|
|
|
|||
|
|
#### Caractéristiques
|
|||
|
|
|
|||
|
|
- **Longueur** : 32 nucléotides par séquence
|
|||
|
|
- **Taille totale** : 96 nucléotides (3 × 32)
|
|||
|
|
- **Format** : FASTA avec en-têtes JSON compatibles
|
|||
|
|
- **Alphabet** : A, C, G, T uniquement (pas de bases ambiguës)
|
|||
|
|
- **Taille du fichier** : 117 bytes
|
|||
|
|
|
|||
|
|
Avec k=21 (défaut), chaque séquence de 32 bp peut produire :
|
|||
|
|
- 32 - 21 + 1 = 12 k-mers
|
|||
|
|
- Plusieurs super k-mers selon les minimiseurs
|
|||
|
|
|
|||
|
|
## Script de test : `test.sh`
|
|||
|
|
|
|||
|
|
### Structure
|
|||
|
|
|
|||
|
|
Le script suit le pattern standard OBITools :
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
TEST_NAME=obisuperkmer
|
|||
|
|
CMD=obisuperkmer
|
|||
|
|
|
|||
|
|
# Variables et fonctions standard
|
|||
|
|
TEST_DIR="..."
|
|||
|
|
OBITOOLS_DIR="..."
|
|||
|
|
TMPDIR="$(mktemp -d)"
|
|||
|
|
ntest=0
|
|||
|
|
success=0
|
|||
|
|
failed=0
|
|||
|
|
|
|||
|
|
cleanup() { ... }
|
|||
|
|
log() { ... }
|
|||
|
|
|
|||
|
|
# Tests (12 au total)
|
|||
|
|
# ...
|
|||
|
|
|
|||
|
|
cleanup
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Tests implémentés
|
|||
|
|
|
|||
|
|
#### 1. Test d'aide (`-h`)
|
|||
|
|
```bash
|
|||
|
|
obisuperkmer -h
|
|||
|
|
```
|
|||
|
|
Vérifie que la commande peut afficher son aide sans erreur.
|
|||
|
|
|
|||
|
|
#### 2. Extraction basique avec paramètres par défaut
|
|||
|
|
```bash
|
|||
|
|
obisuperkmer test_sequences.fasta > output_default.fasta
|
|||
|
|
```
|
|||
|
|
Teste l'exécution avec k=21, m=11 (défaut).
|
|||
|
|
|
|||
|
|
#### 3. Vérification de sortie non vide
|
|||
|
|
```bash
|
|||
|
|
[ -s output_default.fasta ]
|
|||
|
|
```
|
|||
|
|
S'assure que la commande produit un résultat.
|
|||
|
|
|
|||
|
|
#### 4. Comptage des super k-mers
|
|||
|
|
```bash
|
|||
|
|
grep -c "^>" output_default.fasta
|
|||
|
|
```
|
|||
|
|
Vérifie qu'au moins un super k-mer a été extrait.
|
|||
|
|
|
|||
|
|
#### 5. Présence des métadonnées
|
|||
|
|
```bash
|
|||
|
|
grep -q "minimizer_value" output_default.fasta
|
|||
|
|
grep -q "minimizer_seq" output_default.fasta
|
|||
|
|
grep -q "parent_id" output_default.fasta
|
|||
|
|
```
|
|||
|
|
Vérifie que les attributs requis sont présents.
|
|||
|
|
|
|||
|
|
#### 6. Extraction avec paramètres personnalisés
|
|||
|
|
```bash
|
|||
|
|
obisuperkmer -k 15 -m 7 test_sequences.fasta > output_k15_m7.fasta
|
|||
|
|
```
|
|||
|
|
Teste la configuration de k et m.
|
|||
|
|
|
|||
|
|
#### 7. Validation des paramètres personnalisés
|
|||
|
|
```bash
|
|||
|
|
grep -q '"k":15' output_k15_m7.fasta
|
|||
|
|
grep -q '"m":7' output_k15_m7.fasta
|
|||
|
|
```
|
|||
|
|
Vérifie que les paramètres sont correctement enregistrés.
|
|||
|
|
|
|||
|
|
#### 8. Format de sortie FASTA
|
|||
|
|
```bash
|
|||
|
|
obisuperkmer --fasta-output test_sequences.fasta > output_fasta.fasta
|
|||
|
|
```
|
|||
|
|
Teste l'option de format explicite.
|
|||
|
|
|
|||
|
|
#### 9. Vérification des IDs
|
|||
|
|
```bash
|
|||
|
|
grep "^>" output_default.fasta | grep -q "superkmer"
|
|||
|
|
```
|
|||
|
|
S'assure que les IDs contiennent "superkmer".
|
|||
|
|
|
|||
|
|
#### 10. Préservation des IDs parents
|
|||
|
|
```bash
|
|||
|
|
grep -q "seq1" output_default.fasta
|
|||
|
|
grep -q "seq2" output_default.fasta
|
|||
|
|
grep -q "seq3" output_default.fasta
|
|||
|
|
```
|
|||
|
|
Vérifie que les IDs des séquences parentes sont préservés.
|
|||
|
|
|
|||
|
|
#### 11. Option de fichier de sortie (`-o`)
|
|||
|
|
```bash
|
|||
|
|
obisuperkmer -o output_file.fasta test_sequences.fasta
|
|||
|
|
```
|
|||
|
|
Teste la redirection vers un fichier.
|
|||
|
|
|
|||
|
|
#### 12. Vérification de création du fichier
|
|||
|
|
```bash
|
|||
|
|
[ -s output_file.fasta ]
|
|||
|
|
```
|
|||
|
|
S'assure que le fichier a été créé.
|
|||
|
|
|
|||
|
|
#### 13. Cohérence des longueurs
|
|||
|
|
```bash
|
|||
|
|
# Vérifie que longueur(output) <= longueur(input)
|
|||
|
|
```
|
|||
|
|
S'assure que les super k-mers ne sont pas plus longs que l'entrée.
|
|||
|
|
|
|||
|
|
### Compteurs
|
|||
|
|
|
|||
|
|
- **ntest** : Nombre de tests exécutés
|
|||
|
|
- **success** : Nombre de tests réussis
|
|||
|
|
- **failed** : Nombre de tests échoués
|
|||
|
|
|
|||
|
|
### Sortie du script
|
|||
|
|
|
|||
|
|
#### En cas de succès
|
|||
|
|
```
|
|||
|
|
========================================
|
|||
|
|
## Results of the obisuperkmer tests:
|
|||
|
|
|
|||
|
|
- 12 tests run
|
|||
|
|
- 12 successfully completed
|
|||
|
|
- 0 failed tests
|
|||
|
|
|
|||
|
|
Cleaning up the temporary directory...
|
|||
|
|
|
|||
|
|
========================================
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Exit code : **0**
|
|||
|
|
|
|||
|
|
#### En cas d'échec
|
|||
|
|
```
|
|||
|
|
========================================
|
|||
|
|
## Results of the obisuperkmer tests:
|
|||
|
|
|
|||
|
|
- 12 tests run
|
|||
|
|
- 10 successfully completed
|
|||
|
|
- 2 failed tests
|
|||
|
|
|
|||
|
|
Cleaning up the temporary directory...
|
|||
|
|
|
|||
|
|
========================================
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Exit code : **1**
|
|||
|
|
|
|||
|
|
## Intégration CI/CD
|
|||
|
|
|
|||
|
|
### Exécution automatique
|
|||
|
|
|
|||
|
|
Le script est conçu pour être exécuté automatiquement dans un pipeline CI/CD :
|
|||
|
|
|
|||
|
|
1. Le build produit l'exécutable dans `build/obisuperkmer`
|
|||
|
|
2. Le script de test ajoute `build/` au PATH
|
|||
|
|
3. Les tests s'exécutent
|
|||
|
|
4. Le code de retour indique le succès (0) ou l'échec (1)
|
|||
|
|
|
|||
|
|
### Exemple de configuration CI/CD
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# .github/workflows/test.yml ou équivalent
|
|||
|
|
test-obisuperkmer:
|
|||
|
|
runs-on: ubuntu-latest
|
|||
|
|
steps:
|
|||
|
|
- uses: actions/checkout@v2
|
|||
|
|
- name: Build obitools
|
|||
|
|
run: make build
|
|||
|
|
- name: Test obisuperkmer
|
|||
|
|
run: ./obitests/obitools/obisuperkmer/test.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Avantages
|
|||
|
|
|
|||
|
|
✅ **Rapidité** : Données de test minimales (117 bytes)
|
|||
|
|
✅ **Fiabilité** : Tests reproductibles
|
|||
|
|
✅ **Isolation** : Utilisation d'un répertoire temporaire
|
|||
|
|
✅ **Nettoyage automatique** : Pas de fichiers résiduels
|
|||
|
|
✅ **Logging** : Messages horodatés et détaillés
|
|||
|
|
✅ **Compatibilité** : Pattern standard OBITools
|
|||
|
|
|
|||
|
|
## Exécution locale
|
|||
|
|
|
|||
|
|
### Prérequis
|
|||
|
|
|
|||
|
|
1. Compiler obisuperkmer :
|
|||
|
|
```bash
|
|||
|
|
cd /chemin/vers/obitools4
|
|||
|
|
go build -o build/obisuperkmer ./cmd/obitools/obisuperkmer/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. Se placer dans le répertoire de test :
|
|||
|
|
```bash
|
|||
|
|
cd obitests/obitools/obisuperkmer
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. Exécuter le script :
|
|||
|
|
```bash
|
|||
|
|
./test.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Exemple de sortie
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:00 CET 2026] Testing obisuperkmer...
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:00 CET 2026] Test directory is /path/to/obitests/obitools/obisuperkmer
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:00 CET 2026] obitools directory is /path/to/build
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:00 CET 2026] Temporary directory is /tmp/tmp.abc123
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:00 CET 2026] files: README.md test.sh test_sequences.fasta
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:01 CET 2026] OBISuperkmer: printing help OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:02 CET 2026] OBISuperkmer: basic extraction with default parameters OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:02 CET 2026] OBISuperkmer: output file is not empty OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:02 CET 2026] OBISuperkmer: extracted 8 super k-mers OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:02 CET 2026] OBISuperkmer: super k-mers contain required metadata OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:03 CET 2026] OBISuperkmer: extraction with custom k=15, m=7 OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:03 CET 2026] OBISuperkmer: custom parameters correctly set in metadata OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:03 CET 2026] OBISuperkmer: FASTA output format OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:03 CET 2026] OBISuperkmer: super k-mer IDs contain 'superkmer' OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:03 CET 2026] OBISuperkmer: parent sequence IDs preserved OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:04 CET 2026] OBISuperkmer: output to file with -o option OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:04 CET 2026] OBISuperkmer: output file created with -o option OK
|
|||
|
|
[obisuperkmer @ Fri Feb 7 13:00:04 CET 2026] OBISuperkmer: super k-mer total length <= input length OK
|
|||
|
|
========================================
|
|||
|
|
## Results of the obisuperkmer tests:
|
|||
|
|
|
|||
|
|
- 12 tests run
|
|||
|
|
- 12 successfully completed
|
|||
|
|
- 0 failed tests
|
|||
|
|
|
|||
|
|
Cleaning up the temporary directory...
|
|||
|
|
|
|||
|
|
========================================
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Debugging des tests
|
|||
|
|
|
|||
|
|
### Conserver les fichiers temporaires
|
|||
|
|
|
|||
|
|
Modifier temporairement la fonction `cleanup()` :
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cleanup() {
|
|||
|
|
echo "Temporary directory: $TMPDIR" 1>&2
|
|||
|
|
# Commenter cette ligne pour conserver les fichiers
|
|||
|
|
# rm -rf "$TMPDIR"
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Activer le mode verbose
|
|||
|
|
|
|||
|
|
Ajouter au début du script :
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
set -x # Active l'affichage de toutes les commandes
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Tester une seule commande
|
|||
|
|
|
|||
|
|
Extraire et exécuter manuellement :
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
export TEST_DIR=/chemin/vers/obitests/obitools/obisuperkmer
|
|||
|
|
export TMPDIR=$(mktemp -d)
|
|||
|
|
obisuperkmer "${TEST_DIR}/test_sequences.fasta" > "${TMPDIR}/output.fasta"
|
|||
|
|
cat "${TMPDIR}/output.fasta"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Ajout de nouveaux tests
|
|||
|
|
|
|||
|
|
Pour ajouter un test supplémentaire :
|
|||
|
|
|
|||
|
|
1. Incrémenter le compteur `ntest`
|
|||
|
|
2. Écrire la condition de test
|
|||
|
|
3. Logger le succès ou l'échec
|
|||
|
|
4. Incrémenter le bon compteur
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
((ntest++))
|
|||
|
|
if ma_nouvelle_commande_de_test
|
|||
|
|
then
|
|||
|
|
log "Description du test: OK"
|
|||
|
|
((success++))
|
|||
|
|
else
|
|||
|
|
log "Description du test: failed"
|
|||
|
|
((failed++))
|
|||
|
|
fi
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Comparaison avec d'autres tests
|
|||
|
|
|
|||
|
|
### Taille des données de test
|
|||
|
|
|
|||
|
|
| Commande | Taille des données | Nombre de fichiers |
|
|||
|
|
|----------|-------------------|-------------------|
|
|||
|
|
| obiconvert | 925 KB | 1 fichier |
|
|||
|
|
| obiuniq | ~600 bytes | 4 fichiers |
|
|||
|
|
| obimicrosat | 0 bytes | 0 fichiers (génère à la volée) |
|
|||
|
|
| **obisuperkmer** | **117 bytes** | **1 fichier** |
|
|||
|
|
|
|||
|
|
Notre test `obisuperkmer` est parmi les plus légers, ce qui est optimal pour CI/CD.
|
|||
|
|
|
|||
|
|
### Nombre de tests
|
|||
|
|
|
|||
|
|
| Commande | Nombre de tests |
|
|||
|
|
|----------|----------------|
|
|||
|
|
| obiconvert | 3 tests |
|
|||
|
|
| obiuniq | 7 tests |
|
|||
|
|
| obimicrosat | 1 test |
|
|||
|
|
| **obisuperkmer** | **12 tests** |
|
|||
|
|
|
|||
|
|
Notre test `obisuperkmer` offre une couverture complète avec 12 tests différents.
|
|||
|
|
|
|||
|
|
## Couverture de test
|
|||
|
|
|
|||
|
|
Les tests couvrent :
|
|||
|
|
|
|||
|
|
✅ Affichage de l'aide
|
|||
|
|
✅ Exécution basique
|
|||
|
|
✅ Paramètres par défaut (k=21, m=11)
|
|||
|
|
✅ Paramètres personnalisés (k=15, m=7)
|
|||
|
|
✅ Formats de sortie (FASTA)
|
|||
|
|
✅ Redirection vers fichier (`-o`)
|
|||
|
|
✅ Présence des métadonnées
|
|||
|
|
✅ Validation des IDs
|
|||
|
|
✅ Préservation des IDs parents
|
|||
|
|
✅ Cohérence des longueurs
|
|||
|
|
✅ Production de résultats non vides
|
|||
|
|
|
|||
|
|
## Maintenance
|
|||
|
|
|
|||
|
|
### Mise à jour des tests
|
|||
|
|
|
|||
|
|
Si l'implémentation de `obisuperkmer` change :
|
|||
|
|
|
|||
|
|
1. Vérifier que les tests existants passent toujours
|
|||
|
|
2. Ajouter de nouveaux tests pour les nouvelles fonctionnalités
|
|||
|
|
3. Mettre à jour `README.md` si nécessaire
|
|||
|
|
4. Documenter les changements
|
|||
|
|
|
|||
|
|
### Vérification régulière
|
|||
|
|
|
|||
|
|
Exécuter périodiquement :
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd obitests/obitools/obisuperkmer
|
|||
|
|
./test.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Ou via l'ensemble des tests :
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd obitests
|
|||
|
|
for dir in obitools/*/; do
|
|||
|
|
if [ -f "$dir/test.sh" ]; then
|
|||
|
|
echo "Testing $(basename $dir)..."
|
|||
|
|
(cd "$dir" && ./test.sh) || echo "FAILED: $(basename $dir)"
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Conclusion
|
|||
|
|
|
|||
|
|
Les tests pour `obisuperkmer` sont :
|
|||
|
|
|
|||
|
|
- ✅ **Complets** : 12 tests couvrant toutes les fonctionnalités principales
|
|||
|
|
- ✅ **Légers** : 117 bytes de données de test
|
|||
|
|
- ✅ **Rapides** : Exécution en quelques secondes
|
|||
|
|
- ✅ **Fiables** : Pattern éprouvé utilisé par toutes les commandes OBITools
|
|||
|
|
- ✅ **Maintenables** : Structure claire et documentée
|
|||
|
|
- ✅ **CI/CD ready** : Code de retour approprié et nettoyage automatique
|
|||
|
|
|
|||
|
|
Ils garantissent que la commande fonctionne correctement à chaque commit et facilitent la détection précoce des régressions.
|