Testing-with-NPM.html 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <!DOCTYPE html>
  2. <html lang="zh">
  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>使用NPM进行测试([name])</h1>
  11. <p class="desc">
  12. 这篇文章展示了如何将three.js置入[link:https://nodejs.org/en/ node.js]环境中,
  13. 这样你就可以执行自动化测试了。测试可以通过命令行或者类似[link:https://travis-ci.org/ Travis]的CI工具来运行。
  14. </p>
  15. <h2>一句话概括</h2>
  16. <p>
  17. 如果你习惯使用node和npm,
  18. <code>
  19. $ npm install three --save-dev
  20. </code>
  21. 并将
  22. <code>
  23. const THREE = require('three');
  24. </code>
  25. 添加到你的测试中。
  26. </p>
  27. <h2>从头创建一个可测试的项目</h2>
  28. <p>
  29. 如果你不太熟悉这些工具,下面是一个快速入门。(基于linux,在windows上的安装过程会稍稍有点不一样,不过NPM指令是相同的。)
  30. </p>
  31. <h3>基本设置</h3>
  32. <div>
  33. <ol>
  34. <li>
  35. 安装[link:https://www.npmjs.org/ npm]和nodejs。最简单的方式一般像这样
  36. <code>
  37. $ sudo apt-get install -y npm nodejs-legacy
  38. # 修复默认registry URL中任何SSL的问题
  39. $ npm config set registry http://registry.npmjs.org/
  40. </code>
  41. </li>
  42. <li>
  43. 新建一个项目路径
  44. <code>
  45. $ mkdir test-example; cd test-example
  46. </code>
  47. </li>
  48. <li>
  49. 让npm为你创建一份新的项目文件:
  50. <code>
  51. $ npm init
  52. </code>
  53. 在所有出现的提示中敲击回车键来接受默认值。
  54. 这样,一份package.json就建立好了。
  55. </li><br />
  56. <li>
  57. 尝试启动测试功能
  58. <code>
  59. $ npm test
  60. </code>
  61. 当然,这一定会失败。
  62. 如果你检查一下package.json,test script的定义是这样的
  63. <code>
  64. "test": "echo \"Error: no test specified\" && exit 1"
  65. </code>
  66. </li>
  67. </ol>
  68. </div>
  69. <h2>添加mocha</h2>
  70. <div>
  71. 我们将使用[link:https://mochajs.org/ mocha]。
  72. <ol>
  73. <li>
  74. 安装mocha
  75. <code>
  76. $ npm install mocha --save-dev
  77. </code>
  78. 你会注意到 node_modules/ 被创建了,并且你的依赖都出现在了这里面。
  79. 还有你的package.json被更新了,--save-dev指令向其中加入并更新了devDependencies属性。
  80. </li><br />
  81. <li>
  82. 编辑package.json来使用mocha进行测试。当调用测试的时候,我们只想运行mocha并且生成一份详细的报告。
  83. 默认情况下这会运行 test/ 中的任何东西。
  84. (如果项目中没有 test/ 目录的话,会导致npm报错。你可以通过mkdir test来创建这个目录)
  85. <code>
  86. "test": "mocha --reporter list"
  87. </code>
  88. </li>
  89. <li>
  90. 重新运行测试
  91. <code>
  92. $ npm test
  93. </code>
  94. 现在应该就能成功执行了,生成类似 0 passing (1ms) 的报告。
  95. </li>
  96. </ol>
  97. </div>
  98. <h2>添加three.js</h2>
  99. <div>
  100. <ol>
  101. <li>
  102. 现在添加我们的three.js依赖
  103. <code>
  104. $ npm install three --save-dev
  105. </code>
  106. <ul>
  107. <li>
  108. 如果你需要three.js的其他版本,使用
  109. <code>
  110. $ npm show three versions
  111. </code>
  112. 来确认哪些是可用的。要让npm使用正确的版本,执行
  113. <code>
  114. $ npm install [email protected] --save
  115. </code>
  116. (例子中用的是0.84.0)。 --save 指令将此加入项目的dependency而不是dev dependency。
  117. 更多信息请参阅<a href="https://www.npmjs.org/doc/json.html">这份文档</a>。
  118. </li>
  119. </ul>
  120. </li>
  121. <li>
  122. Mocha会在 test/ 目录中寻找测试文件,所以我们先创建这个目录:
  123. <code>
  124. $ mkdir test
  125. </code>
  126. </li>
  127. <li>
  128. 最后我们需要一份JS测试文件来运行。我们就添加一段简单的测试程序,这段程序会检验three.js对象是否能正常工作。
  129. 在 test/ 目录下创建verify-three.js包含以下代码:
  130. <code>
  131. const THREE = require('three');
  132. const assert = require("assert");
  133. describe('The THREE object', function() {
  134. it('should have a defined BasicShadowMap constant', function() {
  135. assert.notEqual('undefined', THREE.BasicShadowMap);
  136. }),
  137. it('should be able to construct a Vector3 with default of x=0', function() {
  138. const vec3 = new THREE.Vector3();
  139. assert.equal(0, vec3.x);
  140. })
  141. })
  142. </code>
  143. </li>
  144. <li>
  145. 最后再次通过$ npm test来测试。这次应该能正确执行上面的代码,并且返回类似:
  146. <code>
  147. The THREE object should have a defined BasicShadowMap constant: 0ms
  148. The THREE object should be able to construct a Vector3 with default of x=0: 0ms
  149. 2 passing (8ms)
  150. </code>
  151. </li>
  152. </ol>
  153. </div>
  154. <h2>加入你自己的代码</h2>
  155. <div>
  156. 你需要做下面三件事:
  157. <ol>
  158. <li>
  159. 为你的代码写一段测试程序来检验期望结果,并把它放在 test/ 目录下。
  160. <a href="https://github.com/air/encounter/blob/master/test/Physics-test.js">这里</a>有一个实际项目的例子。
  161. </li>
  162. <li>
  163. 将你的代码以nodejs承认的方式导出,即可以通过require的方式引用。
  164. 参考<a href="https://github.com/air/encounter/blob/master/js/Physics.js">这份代码</a>。
  165. </li>
  166. <li>
  167. 在测试程序中通过require引入你自己的代码,就像上面例子中我们通过require('three')来引入一样。
  168. </li>
  169. </ol>
  170. <p>
  171. 第2、3条会根据你组织代码的方式而改变。在上面给出的Physics.js的例子中,导出的部分在代码的最末尾。
  172. 我们将module.exports赋值为一个对象:
  173. </p>
  174. <code>
  175. //=============================================================================
  176. // 为了在nodejs中可用
  177. //=============================================================================
  178. if (typeof exports !== 'undefined')
  179. {
  180. module.exports = Physics;
  181. }
  182. </code>
  183. </div>
  184. <h2>处理依赖</h2>
  185. <div>
  186. <p>
  187. 如果你已经在使用require.js或者browserify之类的便捷工具,就跳过这个部分。
  188. </p>
  189. <p>
  190. 一般来说,一个three.js项目将在浏览器中运行,浏览器会通过执行一系列script标签来加载模块。
  191. 你自己的文件不用考虑依赖的问题。然而在nodejs环境中,没有一个关联所有文件的index.html,所以你需要显式地加载。
  192. </p>
  193. <p>
  194. 如果你要导出的模块还依赖其他文件,你需要告诉node去加载它们。下面是一种方式:
  195. </p>
  196. <ol>
  197. <li>
  198. 在你的模块顶部,检查是否处于nodejs环境中。
  199. </li>
  200. <li>
  201. 如果是,那就显式地声明你的依赖。
  202. </li>
  203. <li>
  204. 如果不是,你多半处于浏览器环境中。这时候你不需要做任何多余操作。
  205. </li>
  206. </ol>
  207. 用Physics.js中的代码举例:
  208. <code>
  209. //=============================================================================
  210. // 服务器端测试配置
  211. //=============================================================================
  212. if (typeof require === 'function') // 检测nodejs环境
  213. {
  214. const THREE = require('three');
  215. const MY3 = require('./MY3.js');
  216. }
  217. </code>
  218. </div>
  219. </body>
  220. </html>