【必读】如何编写 ScriptOJ 题目?


  • 0
    administrators

    0. 前言

    ScriptOJ 开放用户编写题目,用户编写的题目可以一键发布到论坛、或者申请加入官方题库,你也可以把题目链接发给你的朋友们把玩。本文会给你一个指引,如何编写 ScriptOJ 的题目。其实很简单也很有趣,我们一起来看看吧。

    1. 填写基本信息

    0_1495565680868_upload-ccbc2605-ef07-4da3-ab85-181fbd9f0a2d

    依次编写标题信息、标签、题目描述(支持 markdown 语法)、难度,都是比较好理解的内容。

    2. 第三方依赖信息

    0_1495565714034_upload-8d40220e-e147-4694-80fe-683fa76d85f1

    • 允许用户使用第三方库:因为不同的题目可能有不同的解决方案,用一些第三方库可能会更加方便,你可以设置题目可以让用户使用哪些第三方的依赖,例如说 jQuery、React 等等。这里 Hello World 例子比较简单,我们就不让用户使用第三方库了。
    • 预先引入第三方库:编写题目的时候你可以让这个题目必须引入某些库,例如 React.js 相关的题目可以填写 React.jsPropTypes 等等,这样即使用户不选择这些库,也会强制引入这些库。

    3. 准备代码

    0_1495565741726_upload-bf20ce48-a4c1-4d62-bbe2-09ec83969070

    准备代码也很好理解,你需要指定用户可以输入什么内容。并且给他们提供一些简单的准备代码。我们这里需要用户输入 JavaScript 的内容,所以就勾选了 "使用 JavaScript",并且写了一些简单的准备代码提供给用户。

    4. 测试依赖和测试代码

    0_1495565829857_upload-da4e719d-3889-465d-b1b8-12d3fdf675e3

    这是 ScriptOJ 测试的核心,用来测试用输入的代码是否符合预期。你必须在测试代码中提供一个 main 函数,相当于入口函数。这个函数会被评测程序自动调用,你需要在这个函数里面对用户输入的代码进行测试。测试代码只有你自己可见。

    4.1 断言库

    而如何进行测试?ScriptOJ 采用的是 chai.js 的 assert 断言库,评测程序已经自动地引入了 chai.js 的 assert,你可以直接使用 assert 对任何东西进行断言。API 和 chai.js 的 assert 一模一样,你只需要参照 chai.js 的文档即可。所有断言的最后一个参数是提示给用户的消息,编写好这个消息可以给用户良好的提示。

    (如果对断言不熟悉的朋友可能需要学习相关的知识,这不在本文的讨论范围当中)

    单纯使用 chai.js 是不够的,所以 ScriptOJ 也提供了一些测试帮助库,你可以在 "测试依赖" 选项中引入你需要的更多的测试帮助库。暂时有:

    • sinon.js:提供各种对函数的测试方法,使用它你可以测试用户的函数是否被正确地调用,调用次数、参数对不对等等。例如上面这个 Hello World 的测试程序就对 console.log 进行了注入,并且在执行 sayHello() 之后进行断言,保证 console.log 执行的次数和参数都是对的。
    • enzyme.js:可以用来测试 React.js 的程序。ScriptOJ 中所有的 React.js 的题目都是用 enzyme.js 进行测试。
    • ...如果需要其他更多的库,可以提建议添加。

    4.2 帮助函数

    另外,ScriptOJ 在全局注入了一些帮助函数,你也许会用到:

    • sleep(ms: Integer):返回一个 Proimse,你可以让函数停止运行一段时间,在测试异步函数的时候相当有用。
    • randomInt(max: Integer):返回整数随机数,例如 randomInt(100) 则返回 0~99 的随机一个数字。
    • randomPick(arr: Array):随机返回数组中的一个元素。
    • randomStr(length: Integer):返回特定长度的随机字符串。

    4.3 理解异常

    ScriptOJ 一旦程序中抛出了异常,ScriptOJ 就会停止执行代码并且把异常信息反馈给用户。整个评测程序就是跟异常打交道,即使成功(Accepeted)也是一个抛出的一个异常。如果你想看到某个信息,你可以尝试抛出异常:

    throw { message: 'What is your name' }
    

    你就会在浏览器看到一个消息 What is your name

    5. 标准答案和提交

    0_1495565861426_upload-d588ca03-1a6b-4903-b69b-f5a8240359de

    为了让测试程序更加健壮,你需要给出一个能够通过测试代码的标准答案,否则无法提交成功。编写好题目以后,你可以点击左下角的 Run 按钮跑一下代码,它只是进行测试而不会保存;而右下角的按钮会对你的题目进行测试并且保存。标准答案只有你自己可见。

    题目提交保存以后,你可以在你自己的题目列表当中看到自己的题目:

    0_1495566107285_upload-5217b216-b8cb-4a65-bed5-32535fcf232d

    有兴趣的话可以点击“申请进入题库”,被采纳就会进入官方题库,显示在“题目”列表。你也可以点击“编辑”页面对题目进行重新的编辑,在编辑页面你可以一键发布到论坛,让其他用户可以看到你的题目:

    0_1495566218468_upload-38a4406a-9f74-4a27-88dd-84cccb4f7773

    目前来说,官方题库采纳跟前端相关性比较强的题目,例如 JavaScript 基础、模式类、框架类,或者在实战、面试中会遇到的题目等。

    6. 关于环境

    使用 ScriptOJ 你几乎可以测试前端的任何东西,所有的用户代码、测试程序都会在后端的浏览器环境中进行运行(具体来说是 Chrome 环境)。所以 BOM、DOM 等都可以测试,具体需要看你的想象力。

    另外,如果你需要更多的测试库的支持(例如 Vue.js、Angular.js 等),可以给 ScriptOJ 提建议。

    Happy hakcing!

    (待续)


  • 0
    administrators

    @Sunjourney 可以来玩玩


  • 0

    @胡子大哈 能在出题以后的特定时间内会给出参考答案吗?有些题目讨论中有答案,有的没有。


  • 0

    @caffrey 是的 强烈推荐


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待