Testing-with-NPM.html 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <!DOCTYPE html>
  2. <html lang="en">
  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>[name]</h1>
  12. <p class="desc">
  13. 本文介绍如何将three.js放入[link:https://nodejs.org/en/ node.js]环境中执行自动化测试。 测试可以在命令行上运行,也可以通过自动化
  14. CI工具,如[link:https://travis-ci.org/ Travis]
  15. </p>
  16. <h2>The short version(简版)</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>Create a testable project from scratch(从头开始创建一个可测试的项目)</h2>
  29. <p>
  30. 如果你不熟悉这些工具,这里有一个快速指南(对于linux,安装过程
  31. 使用Windows会略有不同,但NPM命令是相同的)。
  32. </p>
  33. <h3>Basic setup(基本步骤)</h3>
  34. <div>
  35. <ol>
  36. <li>
  37. 安装 [link:https://www.npmjs.org/ npm] 和 nodejs. 最简短的方法通常类似这样
  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. 创建一个新的项目目录
  46. <code>
  47. $ mkdir test-example; cd test-example
  48. </code>
  49. </li>
  50. <li>
  51. 用npm创建一个项目文件:
  52. <code>
  53. $ npm init
  54. </code>
  55. 接受所有默认设定,在提示问题时候都按回车。这会创建package.json文件。
  56. </li><br />
  57. <li>
  58. 尝试并启动测试功能
  59. <code>
  60. $ npm test
  61. </code>
  62. 这将会失败,符合预期。
  63. 在package.json中, 测试脚本的定义是
  64. <code>
  65. "test": "echo \"Error: no test specified\" && exit 1"
  66. </code>
  67. </li>
  68. </ol>
  69. </div>
  70. <h2>Add mocha(增加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被更新了: 属性devDependencies
  81. 被新增,由于这个指令 --save-dev.
  82. </li><br />
  83. <li>
  84. 编辑 package.json 来调用 mocha来测试. 当测试被调用, 我们只想运行mocha并且定义个显式的reporter。
  85. 默认情况这回运行test/路径下所有的测试
  86. (如果目录test/不存在可能会导致npm ERR!, 通过 mkdir test创建该目录)
  87. <code>
  88. "test": "mocha --reporter list"
  89. </code>
  90. </li>
  91. <li>
  92. 重新运行测试
  93. <code>
  94. $ npm test
  95. </code>
  96. 现在应该成功,并报告 0 passing (1ms)
  97. 或者类似的。
  98. </li>
  99. </ol>
  100. </div>
  101. <h2>Add three.js(增加three.js)</h2>
  102. <div>
  103. <ol>
  104. <li>
  105. 增加 three.js 作为依赖
  106. <code>
  107. $ npm install three --save-dev
  108. </code>
  109. <ul>
  110. <li>
  111. 如果想要指定版本号,那么运行
  112. <code>
  113. $ npm show three versions
  114. </code>
  115. 来看可用的版本号。为了告诉npm正确的版本,使用
  116. <code>
  117. $ npm install [email protected] --save
  118. </code>
  119. (0.84.0 in this example). --save makes this a dependency of this project, rather than
  120. dev dependency. See the docs [link:https://www.npmjs.org/doc/json.html here] for more info.
  121. </li>
  122. </ul>
  123. </li>
  124. <li>
  125. Mocha 会搜索 test/下的测试, 所以
  126. <code>
  127. $ mkdir test
  128. </code>
  129. </li>
  130. <li>
  131. 最后,我们实际上需要运行JS测试。 让我们添加一个简单的测试来验证
  132. three.js对象可用且正常工作。 创建包含以下内容的test/verify-three.js:
  133. <code>
  134. var THREE = require('three');
  135. var assert = require("assert");
  136. describe('The THREE object', function() {
  137. it('should have a defined BasicShadowMap constant', function() {
  138. assert.notEqual('undefined', THREE.BasicShadowMap);
  139. }),
  140. it('should be able to construct a Vector3 with default of x=0', function() {
  141. var vec3 = new THREE.Vector3();
  142. assert.equal(0, vec3.x);
  143. })
  144. })
  145. </code>
  146. </li>
  147. <li>
  148. 最后再用 $ npm test测试一下. 这将运行测试并成功,
  149. 显示如下内容:
  150. <code>
  151. The THREE object should have a defined BasicShadowMap constant: 0ms
  152. The THREE object should be able to construct a Vector3 with default of x=0: 0ms
  153. 2 passing (8ms)
  154. </code>
  155. </li>
  156. </ol>
  157. </div>
  158. <h2>Add your own code(增加自己的代码)</h2>
  159. <div>
  160. 你需要做三件事:
  161. <ol>
  162. <li>
  163. 为了你的行为代码编写测试, 放在 test/路径下.
  164. [link:https://github.com/air/encounter/blob/master/test/Physics-test.js Here] 是一个真实项目的例子.
  165. </li>
  166. <li>
  167. 以nodejs可以识别的方式导出您的功能代码,以与require一起使用。
  168. 见 [link:https://github.com/air/encounter/blob/master/js/Physics.js here].
  169. </li>
  170. <li>
  171. 在测试文件中Require 你的代码, 跟上面例子中的 require('three') 类似.
  172. </li>
  173. </ol>
  174. <p>
  175. 第2项和第3项将根据您管理代码的方式而有所不同。 在Physics.js的例子中
  176. 如上所述,export部分在最后。 我们将一个对象分配给module.exports:
  177. </p>
  178. <code>
  179. //=============================================================================
  180. // make available in nodejs
  181. //=============================================================================
  182. if (typeof exports !== 'undefined')
  183. {
  184. module.exports = Physics;
  185. }
  186. </code>
  187. </div>
  188. <h2>Dealing with dependencies(处理依赖)</h2>
  189. <div>
  190. <p>
  191. 如果你已经使用了聪明的东西,比如require.js或browserify,请跳过这一部分。
  192. </p>
  193. <p>
  194. 通常一个three.js项目会在浏览器运行。浏览器通过执行一堆标签脚本来加载模块。你的个人文件没必要担心依赖问题。但在nodejs上下文中,没有index.html绑定这些,所以必须显式声明。
  195. </p>
  196. <p>
  197. 如果您要导出依赖于其他文件的模块,则必须告诉节点加载它们。
  198. 这是一种方法:
  199. </p>
  200. <ol>
  201. <li>
  202. 在模块开始时,检查您是否在nodejs环境中。
  203. </li>
  204. <li>
  205. 如果是这样,请显式声明您的依赖项。
  206. </li>
  207. <li>
  208. 如果没有,您可能在浏览器中,因此您不需要做任何其他事情。
  209. </li>
  210. </ol>
  211. Example 代码来自Physics.js:
  212. <code>
  213. //=============================================================================
  214. // setup for server-side testing
  215. //=============================================================================
  216. if (typeof require === 'function') // test for nodejs environment
  217. {
  218. var THREE = require('three');
  219. var MY3 = require('./MY3.js');
  220. }
  221. </code>
  222. </div>
  223. </body>
  224. </html>