Testing-with-NPM.html 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <!DOCTYPE html>
  2. <html lang="pt-br">
  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>Testando com NPM</h1>
  11. <p class="desc">
  12. Este artigo mostra como colocar o three.js em um ambiente [link:https://nodejs.org/en/ node.js] para que você
  13. possa executar testes automatizados. Os testes podem ser executados na linha de comando ou por
  14. ferramentas de CI como [link:https://travis-ci.org/ Travis].
  15. </p>
  16. <h2>A versão curta</h2>
  17. <p>
  18. Se você estiver confortável com node e npm,
  19. <code>
  20. $ npm install three --save-dev
  21. </code>
  22. e adicione
  23. <code>
  24. const THREE = require('three');
  25. </code>
  26. para o seu teste.
  27. </p>
  28. <h2>Criar um projeto testável do zero</h2>
  29. <p>
  30. Se você não estiver familiarizado com essas ferramentas, aqui está um guia rápido (para linux, o processo de instalação
  31. será um pouco diferente do que usando o Windows, mas os comandos do NPM são idênticos).
  32. </p>
  33. <h3>Configuração básica</h3>
  34. <div>
  35. <ol>
  36. <li>
  37. Instale o [link:https://www.npmjs.org/ npm] e o nodejs. O caminho mais curto normalmente parece algo como
  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. Crie um novo diretório de projeto
  46. <code>
  47. $ mkdir test-example; cd test-example
  48. </code>
  49. </li>
  50. <li>
  51. Peça ao npm para criar um novo arquivo de projeto para você:
  52. <code>
  53. $ npm init
  54. </code>
  55. e aceite todas as opções default pressionando Enter em todos os prompts.
  56. Isso criará o package.json.
  57. </li><br />
  58. <li>
  59. Experimente iniciar o recurso de teste com
  60. <code>
  61. $ npm test
  62. </code>
  63. Isso falhará, o que é esperado.
  64. Se você olhar no package.json, a definição do script de teste é
  65. <code>
  66. "test": "echo \"Error: no test specified\" && exit 1"
  67. </code>
  68. </li>
  69. </ol>
  70. </div>
  71. <h2>Adicionar mocha</h2>
  72. <div>
  73. Vamos usar o [link:https://mochajs.org/mocha].
  74. <ol>
  75. <li>
  76. Instale o mocha com
  77. <code>
  78. $ npm install mocha --save-dev
  79. </code>
  80. Observe que a pasta node_modules/ é criada e suas dependências aparecem lá.
  81. Observe também que seu package.json foi atualizado: a propriedade devDependencies
  82. é adicionada e atualizada pelo uso de --save-dev.
  83. </li><br />
  84. <li>
  85. Edite o package.json para usar o mocha para teste. Quando o teste for chamado, queremos apenas executar
  86. o mocha e especificar um relatório detalhado. Por padrão, isso executará qualquer coisa em test/
  87. (não ter a pasta test/ pode levar a um ERR! no npm, crie-a pelo comando mkdir test)
  88. <code>
  89. "test": "mocha --reporter list"
  90. </code>
  91. </li>
  92. <li>
  93. Reexecute o teste com
  94. <code>
  95. $ npm test
  96. </code>
  97. Isso agora deve correr bem, reportando "0 passing (1ms)"
  98. ou similar.
  99. </li>
  100. </ol>
  101. </div>
  102. <h2>Adicionar three.js</h2>
  103. <div>
  104. <ol>
  105. <li>
  106. Vamos baixar nossa dependência three.js com
  107. <code>
  108. $ npm install three --save-dev
  109. </code>
  110. <ul>
  111. <li>
  112. Se você precisar de uma versão diferente do three.js, use
  113. <code>
  114. $ npm show three versions
  115. </code>
  116. para listar o que está disponível. Para escolher pelo npm a versão correta, use
  117. <code>
  118. $ npm install [email protected] --save
  119. </code>
  120. (0.84.0 nesse exemplo). --save torna isso uma dependência do projeto, em vez de
  121. dependência dev. Veja os documentos [link:https://docs.npmjs.com/cli/v8/configuring-npm/package-json aqui] para mais informações.
  122. </li>
  123. </ul>
  124. </li>
  125. <li>
  126. Mocha irá procurar por testes em test/, então vamos executar
  127. <code>
  128. $ mkdir test
  129. </code>
  130. </li>
  131. <li>
  132. Finalmente, precisamos de um teste JS para ser executado. Vamos adicionar um teste simples que verificará que
  133. o objeto three.js está disponível e funcionando. Crie test/verify-three.js contendo:
  134. <code>
  135. const THREE = require('three');
  136. const assert = require('assert');
  137. describe('The THREE object', function() {
  138. it('should have a defined BasicShadowMap constant', function() {
  139. assert.notEqual('undefined', THREE.BasicShadowMap);
  140. }),
  141. it('should be able to construct a Vector3 with default of x=0', function() {
  142. const vec3 = new THREE.Vector3();
  143. assert.equal(0, vec3.x);
  144. })
  145. })
  146. </code>
  147. </li>
  148. <li>
  149. Finalmente vamos testar novamente com $ npm test. Isso deve executar os testes acima e ter sucesso,
  150. mostrando algo como:
  151. <code>
  152. The THREE object should have a defined BasicShadowMap constant: 0ms
  153. The THREE object should be able to construct a Vector3 with default of x=0: 0ms
  154. 2 passing (8ms)
  155. </code>
  156. </li>
  157. </ol>
  158. </div>
  159. <h2>Adicione seu próprio código</h2>
  160. <div>
  161. Você precisa fazer três coisas:
  162. <ol>
  163. <li>
  164. Escreva um teste para o comportamento esperado do seu código e coloque-o em test/.
  165. [link:https://github.com/air/encounter/blob/master/test/Physics-test.js aqui] tem um exemplo de um projeto real.
  166. </li>
  167. <li>
  168. Exporte seu código funcional de forma que o nodejs possa vê-lo, para uso em conjunto com require.
  169. Veja isso [link:https://github.com/air/encounter/blob/master/js/Physics.js aqui].
  170. </li>
  171. <li>
  172. Requisite seu código no arquivo de teste, da mesma forma que fizemos um require('three') no exemplo acima.
  173. </li>
  174. </ol>
  175. <p>
  176. Os itens 2 e 3 variam dependendo de como você gerencia seu código. No exemplo de Physics.js
  177. dado acima, a parte de exportação está bem no final. Atribuímos um objeto a module.exports:
  178. </p>
  179. <code>
  180. //=============================================================================
  181. // make available in nodejs
  182. //=============================================================================
  183. if (typeof exports !== 'undefined')
  184. {
  185. module.exports = Physics;
  186. }
  187. </code>
  188. </div>
  189. <h2>Lidando com dependências</h2>
  190. <div>
  191. <p>
  192. Se você já estiver usando algo como require.js ou browserify, pule esta parte.
  193. </p>
  194. <p>
  195. Normalmente, um projeto three.js será executado no navegador. O carregamento do módulo é, portanto, feito pelo
  196. navegador, executando um monte de tags de script. Seus arquivos individuais não precisam se preocupar
  197. com dependências. No entanto, em um contexto nodejs, não há index.html vinculando tudo
  198. junto, então você tem que ser explícito.
  199. </p>
  200. <p>
  201. Se você estiver exportando um módulo que depende de outros arquivos, precisará dizer ao node para carregá-los.
  202. Aqui está uma abordagem:
  203. </p>
  204. <ol>
  205. <li>
  206. No início do seu módulo, verifique se você está em um ambiente nodejs.
  207. </li>
  208. <li>
  209. Em caso afirmativo, declare explicitamente suas dependências.
  210. </li>
  211. <li>
  212. Caso contrário, você provavelmente está em um navegador, então não precisa fazer mais nada.
  213. </li>
  214. </ol>
  215. Código de exemplo de Physics.js:
  216. <code>
  217. //=============================================================================
  218. // setup for server-side testing
  219. //=============================================================================
  220. if (typeof require === 'function') // test for nodejs environment
  221. {
  222. const THREE = require('three');
  223. const MY3 = require('./MY3.js');
  224. }
  225. </code>
  226. </div>
  227. </body>
  228. </html>