Testing-with-NPM.html 7.1 KB

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