Testing-with-NPM.html 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <!DOCTYPE html>
  2. <html lang="fr">
  3. <head>
  4. <meta charset="utf-8">
  5. <base href="../../../" />
  6. <script src="page.js"></script>
  7. <link type="text/css" rel="stylesheet" href="page.css" />
  8. </head>
  9. <body>
  10. <h1>Tests avec NPM ([name])</h1>
  11. <p class="desc">
  12. Ici vous sera expliqué comment obtenir three.js dans un environnement [link:https://nodejs.org/en/ node.js] pour que
  13. vous puissez exécuter des tests automatisés. Les tests peuvent êtres lancés en lignes de commande, ou grâce à des
  14. outils de CI automatisés comme [link:https://travis-ci.org/ Travis].
  15. </p>
  16. <h2>La version courte</h2>
  17. <p>
  18. Si vous êtes à l'aise avec node et npm,
  19. <code>
  20. $ npm install three --save-dev
  21. </code>
  22. et ajoutez
  23. <code>
  24. const THREE = require('three');
  25. </code>
  26. à votre test.
  27. </p>
  28. <h2>Créer un projet testable de zéro</h2>
  29. <p>
  30. Si vous n'êtes pas familier avec ces outils, vous trouverez ici un guide rapide (pour linux, le processus d'installation
  31. sera légèrement différent de celui pour Windows, mais les commandes NPM sont identiques).
  32. </p>
  33. <h3>Setup basique</h3>
  34. <div>
  35. <ol>
  36. <li>
  37. Installez [link:https://www.npmjs.org/ npm] et nodejs. La méthode la plus rapide ressemble généralement à
  38. <code>
  39. $ sudo apt-get install -y npm nodejs-legacy
  40. # fix any problems with SSL in the default registry URL
  41. $ npm config set registry http://registry.npmjs.org/
  42. </code>
  43. </li>
  44. <li>
  45. Créez un nouveau répertoire de projet
  46. <code>
  47. $ mkdir test-example; cd test-example
  48. </code>
  49. </li>
  50. <li>
  51. Demandez à npm de créer un nouveau fichier de projet pour vous:
  52. <code>
  53. $ npm init
  54. </code>
  55. et acceptez tous les paramètres par défaut en appuyant sur Entrée à chaque prompt.
  56. Cela créera package.json.
  57. </li><br />
  58. <li>
  59. Essayez la fonctionnalité de test avec
  60. <code>
  61. $ npm test
  62. </code>
  63. Cela va échouer, comme prévu.
  64. Si vous jetez un coup d'oeil à votre package.json, la définition du test de script sera
  65. <code>
  66. "test": "echo \"Error: no test specified\" && exit 1"
  67. </code>
  68. </li>
  69. </ol>
  70. </div>
  71. <h2>Ajouter mocha</h2>
  72. <div>
  73. Nous allons utiliser [link:https://mochajs.org/ mocha].
  74. <ol>
  75. <li>
  76. Installez mocha avec
  77. <code>
  78. $ npm install mocha --save-dev
  79. </code>
  80. Remarquez que node_modules/ est créé et que vos dépendances y apparaissent.
  81. Notez également que votre package.json a été mis à jour: la propriété devDependencies
  82. est ajoutée et mis à jour par l'utilisation de --save-dev.
  83. </li><br />
  84. <li>
  85. Modifiez votre package.json pour qu'il utilise mocha pour effectuer les tests. Lorsqu'un test est invoqué, nous voulons simplement lancer
  86. mocha et spécifier un verbose reporter. Par défaut cela lancera le contenu de test/
  87. (ne pas avoir de répertoire test/ peut causer une npm ERR!, créez le en utilisant mkdir test)
  88. <code>
  89. "test": "mocha --reporter list"
  90. </code>
  91. </li>
  92. <li>
  93. Relancez les tests avec
  94. <code>
  95. $ npm test
  96. </code>
  97. Cela doit maintenant réussir, signalant 0 passages (1ms)
  98. ou similaire.
  99. </li>
  100. </ol>
  101. </div>
  102. <h2>Ajouter three.js</h2>
  103. <div>
  104. <ol>
  105. <li>
  106. Ajoutons notre dépendance de three.js avec
  107. <code>
  108. $ npm install three --save-dev
  109. </code>
  110. <ul>
  111. <li>
  112. Si vous avez besoin d'une version de three différente, utilisez
  113. <code>
  114. $ npm show three versions
  115. </code>
  116. pour voir
  117. ce qui est disponible. Pour indiquer à npm la bonne, utilisez
  118. <code>
  119. $ npm install [email protected] --save
  120. </code>
  121. (0.84.0 dans cet exemple). --save qui en fait une dépendance de ce projet, au lieu
  122. d'une dépendance dev. Voir la documentation [link:https://docs.npmjs.com/cli/v8/configuring-npm/package-json ici] pour plus d'informations.
  123. </li>
  124. </ul>
  125. </li>
  126. <li>
  127. Mocha cherche des tests dans test/, exécutons donc la commande
  128. <code>
  129. $ mkdir test
  130. </code>
  131. </li>
  132. <li>
  133. Finalement, nous avons besoin d'un test JS à lancer. Ajoutons un test simple qui va vérifier que
  134. l'objet three.js est disponible et fonctionnel. Créez test/verify-three.js contenant:
  135. <code>
  136. const THREE = require('three');
  137. const assert = require('assert');
  138. describe('The THREE object', function() {
  139. it('should have a defined BasicShadowMap constant', function() {
  140. assert.notEqual('undefined', THREE.BasicShadowMap);
  141. }),
  142. it('should be able to construct a Vector3 with default of x=0', function() {
  143. const vec3 = new THREE.Vector3();
  144. assert.equal(0, vec3.x);
  145. })
  146. })
  147. </code>
  148. </li>
  149. <li>
  150. Finalement testons à nouveau avec $ npm test. Cela doit lancer le test ci-dessous et réussir,
  151. affichant quelque chose du genre:
  152. <code>
  153. The THREE object should have a defined BasicShadowMap constant: 0ms
  154. The THREE object should be able to construct a Vector3 with default of x=0: 0ms
  155. 2 passing (8ms)
  156. </code>
  157. </li>
  158. </ol>
  159. </div>
  160. <h2>Ajoutez votre propre code</h2>
  161. <div>
  162. Vous devez faire trois choses:
  163. <ol>
  164. <li>
  165. Écrivez un test pour un comportement attendu de votre code, et placez-le sous test/.
  166. [link:https://github.com/air/encounter/blob/master/test/Physics-test.js Ici] vous trouverez un exemple issu d'un vrai projet.
  167. </li>
  168. <li>
  169. Exportez votre code de manière à ce que nodejs puisse le voir et l'utiliser quand la conjoncture le requiert.
  170. Voir [link:https://github.com/air/encounter/blob/master/js/Physics.js ici].
  171. </li>
  172. <li>
  173. Puis il faut require votre code dans le fichier de test, de la même manière que nous avons require('three') dans l'exemple au-dessus.
  174. </li>
  175. </ol>
  176. <p>
  177. Les items 2 et 3 varient selon la façon dont vous organisez votre code. Dans l'exemple de Physics.js
  178. montré plus-haut, la partie concernant l'export est à la toute fin. Nous assignons un objet à module.exports:
  179. </p>
  180. <code>
  181. //=============================================================================
  182. // make available in nodejs
  183. //=============================================================================
  184. if (typeof exports !== 'undefined')
  185. {
  186. module.exports = Physics;
  187. }
  188. </code>
  189. </div>
  190. <h2>Gérer les dépendances</h2>
  191. <div>
  192. <p>
  193. Si vous utlisez déjà quelque chose d'astucieux comme require.js ou browserify, sautez cette partie.
  194. </p>
  195. <p>
  196. Généralement un projet three.js s'exécute dans le navigateur. Le module de chargement est par conséquent réalisé par
  197. le navigateur qui exécute un ensemble de scripts. Vos fichiers individuels n'ont pas à gérer les
  198. dépendances. Dans un contexte nodejs, il n'y a pas d'index.html reliant tout
  199. ensemble, vous devez donc être explicites.
  200. </p>
  201. <p>
  202. Si vous exportez un module qui dépend d'autres fichiers, vous devrez dire à node de les charger.
  203. Voici une approche:
  204. </p>
  205. <ol>
  206. <li>
  207. Au début de votre module, vérifiez si vous êtes dans un environnement nodejs.
  208. </li>
  209. <li>
  210. Si c'est le cas, déclarez explicitement vos dépendances.
  211. </li>
  212. <li>
  213. Si ce n'est pas le cas, vous êtes probablement dans un navigateur vous n'avez donc rien d'autre à faire.
  214. </li>
  215. </ol>
  216. Code d'exemple issu de Physics.js:
  217. <code>
  218. //=============================================================================
  219. // setup for server-side testing
  220. //=============================================================================
  221. if (typeof require === 'function') // test for nodejs environment
  222. {
  223. const THREE = require('three');
  224. const MY3 = require('./MY3.js');
  225. }
  226. </code>
  227. </div>
  228. </body>
  229. </html>