<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CADJEE Consulting &#187; Test</title>
	<atom:link href="https://cadjee.fr/tag/test/feed/" rel="self" type="application/rss+xml" />
	<link>https://cadjee.fr</link>
	<description>Expertise Java &#38; Système d&#039;information</description>
	<lastBuildDate>Thu, 17 Dec 2015 21:37:19 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.39</generator>
	<item>
		<title>Tester une fonctionnalité complexe avec DBUnit</title>
		<link>https://cadjee.fr/tester-une-fonctionnalite-complexe-avec-dbunit/</link>
		<comments>https://cadjee.fr/tester-une-fonctionnalite-complexe-avec-dbunit/#comments</comments>
		<pubDate>Wed, 02 Dec 2015 13:24:05 +0000</pubDate>
		<dc:creator><![CDATA[Ismael CADJEE]]></dc:creator>
				<category><![CDATA[DbUnit]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[DBUNIT]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://cadjee.fr/?p=208</guid>
		<description><![CDATA[J&#8217;étais confronté récemment à la problématique suivante : tester une suite de fonctionnalité au sein du même test afin de simuler un process métier. La fonctionnalité en question, met à jour ou insert des données en base. Le but du test étant de vérifier en fin de process la présence et cohérence des données en [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;étais confronté récemment à la problématique suivante : tester une suite de fonctionnalité au sein du même test afin de simuler un process métier. La fonctionnalité en question, met à jour ou insert des données en base. Le but du test étant de vérifier en fin de process la présence et cohérence des données en base. Plutôt que faire des requêtes en fin de test puis tester le résultat, nous ferons plûtot un test sur l&rsquo;ensemble de la base pour notre assertion.</p>
<p><a href="http://cadjee.fr/wp-content/uploads/2015/05/DBUnit.jpg"><img class="alignnone size-full wp-image-210" src="http://cadjee.fr/wp-content/uploads/2015/05/DBUnit.jpg" alt="DBUnit" width="1024" height="768" /></a></p>
<ul>
<li><span style="text-decoration: underline;"><strong>Etape 1  et 2 : Extraction des données dans la base réel</strong></span></li>
</ul>
<p>Il s&rsquo;agit de faire une snapshot de la base avant l&rsquo;execution du test. On va extraire que les données qui nous intéresse et non l&rsquo;ensemble de la base. Il faut écrire un main java :</p>
<pre class="brush: java; title: ; notranslate">

....
PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration(&quot;maProp.properties&quot;);
String url = propertiesConfiguration.getString(&quot;URL&quot;);
 String user = propertiesConfiguration.getString(&quot;USER&quot;);
 String password = propertiesConfiguration.getString(&quot;PASSWORD&quot;);
 String schema = propertiesConfiguration.getString(&quot;SCHEMA&quot;);
// database
connection Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
Connection jdbcConnection = DriverManager.getConnection(url, user, password);
IDatabaseConnection connection = new DatabaseConnection(jdbcConnection, schema);
IDataSet createDataSet = connection.createDataSet();
FlatDtdDataSet.write(createDataSet, new FileOutputStream(&quot;src/main/resources/maBase.dtd&quot;));
QueryDataSet partialDataSet = new QueryDataSet(connection);
partialDataSet.addTable(&quot;TABLE_PERSONNE&quot;, &quot;select * from PERSONNE where AGE &amp;amp;lt; 18&quot;);
FlatXmlWriter datasetWriter = new FlatXmlWriter(new FileOutputStream(&quot;jdd.xml&quot;));
datasetWriter.setDocType(&quot;maBase.dtd&quot;); datasetWriter.write(partialDataSet);
 ... </pre>
<p>Db unit nous fourni un jeu de test au format xml qu&rsquo;on placera dans les ressources de nos tests.</p>
<ul>
<li><strong><span style="text-decoration: underline;">Etape 3 , 4 et 5   : écriture du test et load du jdd en base mémoire et extraction du resultat</span></strong></li>
</ul>
<p>On doit à présent loader le jdd.xml dans notre base H2. La encore Db unit nous fournit des outils pour le faire.</p>
<pre class="brush: java; title: ; notranslate">

IDatabaseTester databaseTester = MonDBmemoire.getInstance();
databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
databaseTester.setDataSet(getDataSetFromFile(&quot;path/chemin/jdd.xml&quot;));
databaseTester.onSetup();
...
// mon traitement pour le test
...
//dump de la base apres execution du traitement
private String[]  nomTables={&quot;PERSONNE &quot;, &quot;VILLE&quot;};
IDataSet databaseDataSet = connection().createDataSet(nomTables);
FlatXmlDataSet.write(databaseDataSet, new FileOutputStream(&quot;monDump.xml&quot;));
</pre>
<p>A cette étape on a extrait de la base mémoire, les données voulues apres l&rsquo;execution du test. Il faudra faire une analyse fonctionnelle, afin de s&rsquo;assurer que le résultat obtenu est conforme à ce qui est attendu.</p>
<p>Pour ce faire on peut  soit analyser le fichier xml (monDump.xml) de sortie ou directement requeter en base mémoire. Si vous opter pour la dernière solution n&rsquo;oublier pas de commiter vos donner en mémoire après le test (<strong> </strong>setAutoCommit(false))   puis lancer la commande <em> java -cp h2*.jar org.h2.tools.Server </em>pour activer  le GUI de H2 .</p>
<p>Si le résultat vous convient, placer le fichier monDump.xml dans les ressources de votre test puis  passer à l&rsquo;étape suivante sinon revoir votre code.</p>
<ul>
<li><span style="text-decoration: underline;"><strong>Etape 6 : finalisation du test avec assertion </strong></span></li>
</ul>
<p>A ce stade vous avez valider les données qui ont été inserées/updatées/supprimées en base. Il ne reste plus qu&rsquo;à comparer l&rsquo;état de la base mémoire avec le fichier monDump.xml.  Dans notre classe de test on supprimera la partie d&rsquo;extraction dump qu&rsquo;on remplcera par le code suivant :</p>
<pre class="brush: java; title: ; notranslate">
...
private String[]  nomTables={&quot;PERSONNE &quot;, &quot;VILLE&quot;};
IDataSet databaseDataSet = connction.createDataSet();
IDataSet expectedDataSet = getDataSetFromFile(&quot;path/vers/chemin/monDump.xml&quot;);
for (String tb: nomTables) {
ITable actualTable = databaseDataSet.getTable(tb);

ReplacementTable expectedTable = new ReplacementTable(expectedDataSet.getTable(tb));
expectedTable.addReplacementObject(&quot;${date-today}&quot;, new SimpleDateFormat(&quot;yyyy-MM-dd&quot;).format(new Date()));
Assertion.assertEquals(new SortedTable(expectedTable, actualTable.getTableMetaData()),new SortedTable(actualTable, actualTable.getTableMetaData()));
</pre>
]]></content:encoded>
			<wfw:commentRss>https://cadjee.fr/tester-une-fonctionnalite-complexe-avec-dbunit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selenium 2: tester vos interfaces graphiques</title>
		<link>https://cadjee.fr/selenium-2-tester-vos-interfaces-graphiques/</link>
		<comments>https://cadjee.fr/selenium-2-tester-vos-interfaces-graphiques/#comments</comments>
		<pubDate>Fri, 25 Sep 2015 13:06:53 +0000</pubDate>
		<dc:creator><![CDATA[Ismael CADJEE]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[GUI test]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[TU]]></category>

		<guid isPermaLink="false">http://cadjee.fr/?p=191</guid>
		<description><![CDATA[Pour automatiser vos tests UI, la suite Selenium offre de grande possibilité. Supportant mutile langage C#, php, python et bien évidement Java, la suite propose également un plugin firefox ( Selenium IDE)  pour enregistrer, à la façon des macros excels,  toutes les actions utilisateur ( clics, drag and drop, saisie etc&#8230;).  Ces actions seront ensuite [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pour automatiser vos tests UI, la suite Selenium offre de grande possibilité. Supportant mutile langage C#, php, python et bien évidement Java, la suite propose également un plugin firefox ( Selenium IDE)  pour enregistrer, à la façon des macros excels,  toutes les actions utilisateur ( clics, drag and drop, saisie etc&#8230;).  Ces actions seront ensuite exporter sous forme de TestCase qu&rsquo;il suffira d&rsquo;importer dans vos projets. Certaines actions ne sont malheureusement pas enregistrable par le plugin: gestion des pop up, authentification par basic form ( la fameuse fenêtre Authentification Required) par exemple.<br />
<span id="more-191"></span></p>
<p>&nbsp;</p>
<ul>
<li><span style="text-decoration: underline;"><span style="text-decoration: underline;"><strong>Dependance Maven</strong></span></span></li>
</ul>
<pre class="brush: java; title: ; notranslate">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
	&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
	&lt;groupId&gt;fr.cadjee.testUI&lt;/groupId&gt;
	&lt;artifactId&gt;CadjeeSelenium&lt;/artifactId&gt;
	&lt;version&gt;1.0&lt;/version&gt;

	&lt;build&gt;
	&lt;plugins&gt;
		&lt;plugin&gt;
			&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
			&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
			&lt;configuration&gt;
				&lt;testFailureIgnore&gt;true&lt;/testFailureIgnore&gt;
			&lt;/configuration&gt;
		&lt;/plugin&gt;
	&lt;/plugins&gt;
&lt;/build&gt;

	&lt;dependencies&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.seleniumhq.selenium&lt;/groupId&gt;
			&lt;artifactId&gt;selenium-java&lt;/artifactId&gt;
			&lt;version&gt;2.46.0&lt;/version&gt;
		&lt;/dependency&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;junit&lt;/groupId&gt;
			&lt;artifactId&gt;junit&lt;/artifactId&gt;
			&lt;version&gt;4.11&lt;/version&gt;
			&lt;scope&gt;test&lt;/scope&gt;
		&lt;/dependency&gt;
	&lt;/dependencies&gt;
&lt;/project&gt;

</pre>
<p>&nbsp;</p>
<ul>
<li><strong>Selenium</strong><span style="text-decoration: underline;"><strong> IDE </strong></span></li>
</ul>
<p>Toutes les actions sont enregistrées puis exportable via le Menu <em>File &gt; Export Test Case As &#8230;&gt; Java Junit 4 / Web Driver</em>. Les autres options (WebDriver Backed&#8230;ect ) seront bientôt obsolètes. Ils sont la uniquement pour assurer la rétro comptabilité entre la version selenium 1 RC et selenium 2 WebDriver.</p>
<p><a href="http://cadjee.fr/wp-content/uploads/2015/05/seleniumIDE.jpg"><img class="alignnone size-full wp-image-194" src="http://cadjee.fr/wp-content/uploads/2015/05/seleniumIDE.jpg" alt="seleniumIDE" width="600" height="721" /></a></p>
<p>&nbsp;</p>
<p>Les classes java sont  à importer dans votre projet sous forme de test ou main exécutable. La forme &lsquo;testCase&rsquo; permet d&rsquo;automatiser plus naturellement votre application avec Maven et Jenkins.</p>
<p>&nbsp;</p>
<ul>
<li><strong><span style="text-decoration: underline;">Forcer Selenium à utiliser un autre navigateur différent du navigateur par défaut </span></strong></li>
</ul>
<p>Les test UI peuvent s’exécuter sur différent navigateurs sachant que le navigateur par défaut de Selenium est FireFox. Pour cela il va chercher dans le Path de votre OS le chemin vers votre FireFox. Dans mon cas je veux plutôt utiliser un FireFoxPortable ( donc non présent dans le PATH):</p>
<pre class="brush: java; title: ; notranslate">&lt;/pre&gt;
public class SeleniumForFirefoxCase {

protected static WebDriver driver;
protected static String baseUrl;
protected boolean acceptNextAlert = true;
protected static StringBuffer verificationErrors = new StringBuffer();
private static final String URL_EXE_FIREOX = &quot;C:\\Documents\\selenium\\FirefoxPortable\\FirefoxPortable.exe&quot;;

...

@BeforeClass
public static void init() {
File pathToBinary = new File(URL_EXE_FIREOX);
FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
FirefoxProfile firefoxProfile = new FirefoxProfile();
driver = new FirefoxDriver(ffBinary, firefoxProfile);
}

}
</pre>
<p>J&rsquo;ai déclarer le driver en <strong>static</strong> afin d&rsquo;avoir une seule instance du firefox pour mes tests. Cela évite d&rsquo;ouvrir plusieurs fenêtres de fireFox. Je peux ainsi enchaîner mes tests sur la même fenêtre.<br />
Pour info il est possible d’exécuter les tests sur IE, Chrome, Safari&#8230;Ect et même en mode non graphique via le driver <em><strong>HtmlUnitDriver.</strong></em></p>
<p>&nbsp;</p>
<ul>
<li><span style="text-decoration: underline;"><strong>Form Based Authentication : Fenêtre d&rsquo;authentification </strong></span></li>
</ul>
<p>Ces fenêtres vous demandent de vous authentifier pour accéder à une page donnée. Souvent l&rsquo;oeuvre d&rsquo;un JAAS ou Valve défini au sein de votre application:</p>
<p><a href="http://cadjee.fr/wp-content/uploads/2015/05/authen.png"><img class="alignnone size-full wp-image-199" src="http://cadjee.fr/wp-content/uploads/2015/05/authen.png" alt="authen" width="320" height="134" /></a></p>
<p>&nbsp;</p>
<p>L&rsquo;IDE ne sait pas enregistrer cette action. Il va falloir passer par programmation. L&rsquo;astuce est simple: ajouter dans l&rsquo;url le  mot de passe et le login :</p>
<pre class="brush: java; title: ; notranslate">

public class SeleniumForFirefoxCase {
...
protected static String baseUrl;

...

@BeforeClass
public static void init()
{
...
baseUrl = &quot;http://login:motDePasse@localhost:8080/monAppli/&quot;;
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(baseUrl);

...
}
</pre>
<ul>
<li><strong><span style="text-decoration: underline;">Gestion des pop up </span></strong></li>
</ul>
<p>Pour gérer la pop up il faut indiquer au driver de switcher de fenêtre car par défaut  c&rsquo;est toujours la fenêtre principale qui est prise en compte:</p>
<pre class="brush: java; title: ; notranslate">
@Test
public void Scenario1_OuverturePopUp() throws Exception {

// ouverture de la pop up

driver.findElement(By.xpath(&quot;//a[contains(@href, \&quot;lienPopUp')\&quot;)]&quot;)).click();

// On recupere l'id des fenetres actives
Set&lt;String&gt; windowId = driver.getWindowHandles();

Iterator&lt;String&gt; itererator = windowId.iterator();

//1er fenetre
String mainWinID = itererator.next();
System.out.println(mainWinID);
//2de fenetre le pop up
String popUpID = itererator.next();
System.out.println(popUpID);

//On switch de fenetre
driver.switchTo().window(popUpID);
System.out.println(driver.getTitle());
Assert.assertEquals(&quot;Refus demande&quot;, driver.getTitle());
driver.findElement(By.name(&quot;commentaire&quot;)).clear();

//envoie d'une valeur dans la zone de texte de la pop up
driver.findElement(By.name(&quot;commentaireRefus&quot;)).sendKeys(&quot;test pop up selenium&quot;);
</pre>
<ul>
<li>
<h4><span style="text-decoration: underline;"><strong>Conclusion</strong></span></h4>
</li>
</ul>
<p>L&rsquo;intégration par Maven permet l’exécution des tests de la même façon q&rsquo;un test unitaire classique. Mais ne nous y méprenons pas, Selenium n&rsquo;a pas vocation à remplacer un TU et vis versa!</p>
<p>Pour aller un peu plus loin, il est même conseillé d&rsquo;utiliser une base mémoire tel que H2. On peux également utiliser un serveur Jetty plus léger et plus rapide. Enfin Une connaissance de <span style="text-decoration: underline;">Xpath est obligatoire</span> pour mener à bien votre intégration de Selenium.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://cadjee.fr/selenium-2-tester-vos-interfaces-graphiques/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
