mercredi 28 juillet 2010

maven : test unitaire dans différents projets

Supposons que nous avons le projet suivant:

Commons
^
|
|
Core
^
|
|
IHM

Je veux faire des tests unitaires ds IHM et utiliser les classes de base de mes tests unitaires dans Commons.

Sous maven , il est parfois utile d'avoir des tests unitaires du module "Core" ... Cependant ces derniers peuvent avoir à utiliser des classes de tests du module "Commons" dans d'autres projets comme BaseTest ...

Une classe dont toutes les classes de test vont héritées, et qui est responsable de l'initialisation de ressources diverses comme la connexion à la BDD, l'instantiation des beans. Le problème est que maven en version 2.X ne permet pas l'export des classes de tests ...

Voici la recette :

Il faut générer un jar de test, pour cela, ajouter dans Commons :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>

Pour l'utiliser, ajouter la dependance dans le pom.xml du projet IHM
<dependency>
<groupId>monProjet</groupId>
<artifactId>Commons</artifactId>
<version>1-0.SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>

Une petite astuce pour ne pas stopper la compilation pendant les tests est d'utiliser

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>

Ou encore
mvn test -Dmaven.test.failure.ignore=true

Une technique différente peut-être de créer un projet séparé de test, et qui ne se déclenche que lors des phase de test d'intégration ...

Un bon article ...

shell : commande tar

un petit rappel pour faire des tar un peu compliqué ...

Tout d'abord, les bases :

Créer une archive commpressée :

Dans l'exemple suivant, on crée une archive nommée monfichier.tar.gz, dans laquelle on ajoute 2 réperoires unRepertoirenommé respectivement "unRepertoire" et "unSecondRepertoire". De plus on ajoute, un fichier nommé "unFichier.txt"
tar -cvzf monfichier.tar.gz unRepertoire unSecondRepertoire unFichier.txt

Décompresser une archive :
Dans cet exemple, on décompresse l'archive nommée "monfichier.tar.gz" vers le repertoire de destination nommé "unRepertoireDestination"

tar -xvf monfichier.tar.gz unRepertoireDestination


Voici, une commande qui permet de faire un tar sans avoir à recréer l'arborescence des fichiers, la commande prend tout les pom.xml et les ajoute à l'archive.

Ensuite, j'ajoute les 2 répertoires manquants :


find ./java/ -name pom.xml -exec tar -uvf projetRef.tar {} \;
tar -uvf bocRef.tar java/projet-config
tar -uvf bocRef.tar java/projet-orchestre/projet-batch


Une autre option utile est -P, en effet, cette option met des chemin absolu. Ceci peut-être très pratique pour créer par exemple des configuration pour différents environnement, et n'avoir qu'a les dezipper ... ou à les copier avec une commande du type "cp --parents" ..

vendredi 23 juillet 2010

Analyse LOG : rechercher le nombre de FATAL, ERREUR, WARN

voici, une commande que je ne comprends pas complètement, mais qui fonctionne :


nbFatal=`grep FATAL $2*.log | sed "s/.*\(FATAL.*\)/\1/" | tee $1.1 | wc -l`

nbErrors=`grep ERROR $2*.log | sed "s/.*\(ERROR.*\)/\1/" | tee $1.2 | wc -l`

nbWarns=`grep WARN $2*.log | sed "s/.*\(WARN.*\)/\1/" | tee $1.3 | wc -l`

svn : commandes utiles

faire un checkout :
svn checkout file:///home/enwoo/repos/monAppli/ /home/enwoo/workspace/monAppli

ou par défaut, le port du serveur svn est 3609 ...

svn checkout svn:///home/enwoo/repos/monAppli/ /home/enwoo/workspaceLocal/monAppli


- Il est important de noter, que les commandes SVN peuvent être lancé sur la working copy, ou sur le "serveur". Ceci dépends de si on utilise ou non, une URL.
- Il faut noter que des options génériques à toutes les commandes sont possible (ex: --parents, ou --force) et que ces options se place avant la commande (cf. exemple suivant)


- Si c'est une commande serveur, elle est exécutée immédiatement.
- sinon, elle est en attente et sera réalisée plus tard, lors d'un commit ... (Ceci, peut-être vu, via le svn status /home/enwoo/repos/monAppli )

Par exemple, dans le cas d'une commande de mkdir :

svn --parents mkdir http://monServeurSVN/svn/monAppli/src/main/java -m 'creation de l arbo maven'

Cette commande contient une url: (ici http://fretsvn.si.fret.sncf.fr/svn/monAppli/src/main/java) , cette commande de création des répertoires (src/main/java) est donc une commande serveur, et exécutée immédiatement.


Dans le cas d'une commande sur le "working copy", cette commande sera "schedulé" par cvs plus tard ... lors du commit ...

svn mv -m "deplacement" script.sql /home/enwoo/workspaceLocal/monAppli/src/main/java

svn : création repository, import source , serveur svn

1) tout d'abord, il faut créer un nouveau repository :

un petit script qui recrée rapidement un repo svn propre ...


#/bin/bash
rm -rf /repos/monAppli
svnadmin create /repos/monAppli
chmod -R 777 /repos/monAppli
svn import -m "init import" /repos/tmpBoc/java/ file:///repos/monAppli


Tout d'abord, la commande de création d'un repo vide (qui sera crée physiquement sur /repos/monAppli):
svnadmin create /repos/monAppli

Une fois crée, il faut importer les sources du projet (qui sont copier sur le serveur /repos/tmpBoc/java) dans ce repo vide (à noter que j'ai utiliser le protocole file pour l'URL (http, ne fonctionnait pas, mais devrait):
svn import -m "init import" /repos/tmpBoc/java/ file:///repos/monAppli

Un autre exemple sous Windows :
s>svn import -m "init import" D:\sourcesMonProjet file:///D:/repoSVN/monProjet

Ensuite, le met tout les droits car c'est un repo de test et je le supprime régulièrement ...

Ensuite, il est nécessaire de démarrer le serveur svn via la commande :
ici, le serveur est démarré en mode deamon, sur le repertoire /repos
svnserve -d -r /repos

ou tout simplement:

Un autre exemple sous Windows :
svnserve -d


Pour un checkout via le protocole svn (port 3609 par défaut):
svn co --username=enwoo --passsword=enwoo svn://localhost/repoSVN/monProjet .

ou encore :
svn co svn://enwoo@localhost/repoSVN/monProjet D:\sources

jeudi 22 juillet 2010

Weblogic : arrêt / redémarrage / status d'un serveur manager

Voici, des commande qui demarre un serveur weblogic via la console et le "node manager"

Demarrage du serveur nommé "businessServer" via le serveur d'administration nommé "monServeurAdmin" situé sur le port 10121 (un autre exemple d'url : )

java weblogic.Admin -url t3://monServeurAdmin:10121 -username weblogic -password weblogic START businessServer


Obtenir le status du serveur :
java weblogic.Admin -url t3://monServeurAdmin:10121 -username weblogic -password weblogic GETSTATE


Arret forcé du serveur :
java weblogic.Admin -url t3://monServeurAdmin:10121 -username weblogic -password weblogic SHUTDOWN businessServer &

lundi 12 juillet 2010

bash: element de script for / sed / while /case

Voici un super site qui explique tout !!!

Voici, un petit script bash , permettant de faire des "svn move" en ne selectionnant que des fichiers différents de *.java et des revisions svn-base

a noter set -x pour aider au debug su script

et la commande find avec regex

Attention, lors de l'utilisation de regex, il est nécessaire d'ajouter le path courant ... comme suit :

find /home/enwoo -regex '.*/*.java'

Voici, le script complet :


function mvResourcesNotJava()
{
set -x
ORI_REP="$1"
DEST_REP="$2"

if [[ ( -e "$ORI_REP" ) ]]
then
#copie de toutes les resources differentes de java, .cvsignore, pom.xml, .svn-base
files=`find "$ORI_REP" \( ! \( -regex '.*/*.svn-base' -o -regex '.*/*.java' -o -regex '.*/.svn.*' -o -regex '.*/*.cvsignore' -o -regex 'pom.xml' \) \) -type f`

for file in ${files}
do
# creation si besoin
if [ ! -e "$DEST_REP" ]
then
addDirInConf "$DEST_REP" "$DEST_REP/.."
fi
# copie de la ressources
svn mv "${file}" "${DEST_REP}"
done
# ajout en gest conf
svn add --force "${DEST_REP}"
svn commit "${DEST_REP}" --message "deplacement de ressources pour maven"
else
echo "les repertoires [$1] n'existe pas"
fi
}



Un autre exemple, ou cette fois on parcours un fichier ligne par ligne ... afin d'utiliser les lignes dans un for


#!/bin/bash

dos2unix liste.txt
STR_REMP=$STR_REMP
SRC_DIR=`echo "$1" | sed -e "s@D:@$STR_REMP@g"`
DST_DIR=`echo "$2" | sed -e "s@D:@$STR_REMP@g"`
if [ "$#" -ne 2 ]
then
echo "le nombre de parametres doit etre egale a 2"
echo "copie les fichiers entre 2 arborescences identiques, via cygwin "
echo "usage : "
echo "ex : $0 D:/ArchCvs/V9 D:/ArchCvs/java"
exit -1
fi

if [[ ! ( -e "$SRC_DIR" || -e "$DST_DIR" ) ]]
then
echo "l'un des repertoires suivants n'existe pas"
echo "$SRC_DIR"
echo "$DST_DIR"
else
while read line
do
#set -x
line=`echo "$line" | sed -e "s@D:@$STR_REMP@g"`
FILE_DST=`echo "$line" | sed -e "s@$SRC_DIR@$DST_DIR@g"`
FILE_DST=`dirname $FILE_DST`
cp -fv $line $FILE_DST
done < liste.txt
exit 0
fi


Voici, un autre exemple tiré de la commande mkdir de cygwin

#!/bin/sh
##
## mkdir.sh -- make directory hierarchy
##
## Based on `mkinstalldirs' from Noah Friedman
## as of 1994-03-25, which was placed in the Public Domain.
## Cleaned up for Apache's Autoconf-style Interface (APACI)
## by Ralf S. Engelschall
##
#
# This script falls under the Apache License.
# See http://www.apache.org/docs/LICENSE


umask 022
errstatus=0
for file in ${1+"$@"} ; do
set fnord `echo ":$file" |\
sed -e 's/^:\//%/' -e 's/^://' -e 's/\// /g' -e 's/^%/\//'`
shift
pathcomp=
for d in ${1+"$@"}; do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
?: ) pathcomp="$pathcomp/"
continue ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp" 1>&2
mkdir "$pathcomp" || errstatus=$?
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus


Voici un petit rappel, des paramètres spéciaux :


$0 Contient le nom du script tel qu'il a été invoqué
$* L'ensembles des paramètres sous la forme d'un seul argument
$@ L'ensemble des arguments, un argument par paramètre
$# Le nombre de paramètres passés au script
$? Le code retour de la dernière commande
$$ Le PID su shell qui exécute le script
$! Le PID du dernier processus lancé en arrière-plan


et les différents tests possibles (ici, un très bon cours):

Opérateur Description Exemple
Opérateurs sur des fichiers
-e filename vrai si filename existe [ -e /etc/shadow ]
-d filename vrai si filename est un répertoire [ -d /tmp/trash ]
-f filename vrai si filename est un fichier ordinaire [ -f /tmp/glop ]
-L filename vrai si filename est un lien symbolique [ -L /home ]
-r filename vrai si filename est lisible (r) [ -r /boot/vmlinuz ]
-w filename vrai si filename est modifiable (w) [ -w /var/log ]
-x filename vrai si filename est exécutable (x) [ -x /sbin/halt ]
file1 -nt file2 vrai si file1 plus récent que file2 [ /tmp/foo -nt /tmp/bar ]
file1 -ot file2 vrai si file1 plus ancien que file2 [ /tmp/foo -ot /tmp/bar ]
Opérateurs sur les chaînes
-z chaine vrai si la chaine est vide [ -z "$VAR" ]
-n chaine vrai si la chaine est non vide [ -n "$VAR" ]
chaine1 = chaine2 vrai si les deux chaînes sont égales [ "$VAR" = "totoro" ]
chaine1 != chaine2 vrai si les deux chaînes sont différentes [ "$VAR" != "tonari" ]
Opérateurs de comparaison numérique
num1 -eq num2 égalité [ $nombre -eq 27 ]
num1 -ne num2 inégalité [ $nombre -ne 27 ]
num1 -lt num2 inférieur ( < ) [ $nombre -lt 27 ]
num1 -le num2 inférieur ou égal ( < =) [ $nombre -le 27 ]
num1 -gt num2 supérieur ( > ) [ $nombre -gt 27 ]
num1 -ge num2 supérieur ou égal ( > =) [ $nombre -ge 27 ]


Rappel des commandes sed utiles :


sed -e 's/enwoo/toto/' => remplacement de la première occurence de enwoo par toto
sed -e 's/enwoo/toto/g' => remplacement de toutes les occurences de enwoo par toto
sed -e 's/enwoo/toto/3' => remplacement de la 3ième occurence de enwoo par toto
sed -e 's@enwoo@toto@3' => remplacement de la 3ième occurence de enwoo par toto mais le séparateur est @ et pas slash (ce qui est très utile lorsque l'on veut remplacer des chemins)


un exemple avec une sortie dans un fichier des remplacements de enwoo par toto (avec w):

echo 'http://monServeurSvn/svn/projetTest/java/com/enwoo' | sed -e 's@enwoo@toto@w res.txt'


on peut combiner les flags :
echo 'http://monServeurSvn/svn/projetTest/java/enwoo/com/enwoo' | sed -e 's@enwoo@toto@gw res.txt'

ce qui donne :
http://monServeurSvn/svn/projetTest/java/toto/com/toto

ou encore :
echo 'http://monServeurSvn/svn/projetTest/java/enwoo/com/enwoo' | sed -e 's@enwoo@toto@2w res.txt'
http://monServeurSvn/svn/projetTest/java/enwoo/com/toto


Une autre commandes utile, la suppression :
sed "/toto/d" monFichier => supprime les lignes contenant enwoo

sed "/toto/!d" monFichier => supprime les lignes ne contenant pas enwoo