如何对谷歌应用程序脚本进行单元测试?

Posted

技术标签:

【中文标题】如何对谷歌应用程序脚本进行单元测试?【英文标题】:how to unit test google apps scripts? 【发布时间】:2013-03-18 22:06:12 【问题描述】:

我正在尝试为谷歌应用脚​​本设置单元测试,我发现了两个项目:

https://code.google.com/p/gas-unit/ https://code.google.com/p/gasunit/

所以我很困惑该使用哪个:-)

我刚刚尝试了不带连字符的gasunit,它似乎期望脚本嵌入在电子表格中,我有点不清楚如何做......而且我要测试的脚本是基于网络的脚本而不是电子表格的

我更幸运地测试了带连字符的气体单元,它成功地向我发送了测试的电子邮件输出并在我的谷歌网站上生成了一个结果页面:

https://sites.google.com/site/testappscript2/TestResults

所以我现在打算使用 gas-unit,但我真的很想看到一些由 Google 合并的官方测试框架。特别是我想找到一些方法让这些脚本以某种频率运行以向我发送结果。我也很想获得一些 BDD;查看我的其他帖子:

How to get Cucumber/Capybara/Mechanize to work against external non-rails site how to use capybara has_text

来吧,谷歌,你所有的浴室里都有“测试石头,调试垃圾”吗?如何更好地支持 Google Apps 脚本测试?

【问题讨论】:

【参考方案1】:

你可以试试QUnit for Google Apps Script。它是 patch 的 QUnit 变成了带有 API docs 的 Google Apps 脚本库。

您所需要的只是一个脚本项目,该项目导入一个 QUnit 库(例如带有项目键 MxL38OxqIK-B73jyDTvCe-OBao7QLBR4j 的库)并具有一个 doGet 函数,该函数使用 URL 参数配置 QUnit,也可以使用您自己的设置,加载一个函数运行你的测试,最后返回 QUnit.gethtml()。这是一个例子:

function doGet( e ) 
  QUnit.urlParams( e.parameter );
  QUnit.config( title: "Unit tests for my project" );
  QUnit.load( myTests );
  return QUnit.getHtml();
;

// Imports the following functions:
// ok, equal, notEqual, deepEqual, notDeepEqual, strictEqual,
// notStrictEqual, throws, module, test, asyncTest, expect
QUnit.helpers(this);

function myTests() 
  module("dummy module");

  test("dummy test", 1, function() 
    ok(true);
  );

然后授权脚本,保存它的一个版本,发布脚本项目(“部署为 Web 应用程序”)并使用您的浏览器转到测试 URL(“最新代码”)。您的测试将运行,结果将通过 HtmlService 显示。您可以单击它们以查看它们的断言,但在撰写本文时,由于Caja issue 1688,您可能无法在 Firefox 20 和 21 中执行此操作。

【讨论】:

这里有很好的说明,在“示例使用”下:github.com/simula-innovation/qunit/tree/gas/gas 请注意,如果您通过 google apps 脚本部署 webapp,则必须来回切换 doGet 函数名称。 TypeError:无法从未定义中读取属性“全部”。 (第 263 行,文件“qunit.js”,项目“QUnit”) 我发现 QUnit 是这里列出的最佳选择。这是另一个教程:tothenew.com/blog/how-to-test-google-apps-script-using-qunit 我想让 jasmine/rajah 工作,但是在 gas-console 中的依赖存在一些问题,它在 GAS 环境中不再工作。 这还没有为 v8 引擎更新,所以你需要在 2020 年之后使用 QUnitGS2。【参考方案2】:

我刚刚为我的谷歌电子表格插件开发和测试编写了另一个名为 GasT 的测试框架。

GasT 是适用于 Google Apps 脚本的 TAP 兼容测试框架。它提供了一种简单的方法来验证您编写的 GAS 程序是否按预期运行。 https://github.com/huan/gast

我的目标是获得一个简单的点击工具,例如磁带(用于 javascript)或 bats(用于 bash)。测试套件的格式很清楚:

var gastLibUrl = 'https://raw.githubusercontent.com/zixia/gast/master/src/gas-tap-lib.js'
eval(UrlFetchApp.fetch(gastLibUrl).getContentText())

var test = GasTap.setPrintDriver('Logger') 

function gast() 

  test('do calculation right', function (t)     
    var i = 3 + 4
    t.equal(i, 7, 'I can calc 3 + 4 = 7')
  )

  test('Spreadsheet exist', function (t) 
    var ss = SpreadsheetApp.openById('1TBJpvlW3WWney4rk1yW5N9bAP8dOMkWxI97dOtco-fc')
    t.ok(ss, 'I can open spreadsheet')
  )

  test.finish()

希望有人会喜欢它。 :)

有一个在线版本,你可以去这里看看:https://docs.google.com/spreadsheets/d/19M2DY3hunU6tDQFX5buJmZ_f3E8VFmlqAtodyC-J8Ag/edit#gid=0&vpid=A1

【讨论】:

是的,一个超级简单的工具,可以让你继续前进。我喜欢 GAS 的 QUnit,但有一个技术问题。在我看来,GAST 是一个很好的后备方案。【参考方案3】:

clasp tool 提供了从命令行在本地开发和部署 Apps 脚本项目的能力。

来自clasp repo:

    npm install -g @google/clasp 启用 Apps 脚本 API:https://script.google.com/home/usersettings 本地开发,使用clasp工具进行部署。

编辑 node-google-apps-script 项目已被弃用,取而代之的是 clasp

node-google-apps-script 包允许使用标准 JavaScript 包和自动化测试工具。

    npm install -g node-google-apps-script。 通过authorization steps 提供客户端机密以允许上传和导入 Apps 脚本项目。 使用gulpgrunt 或任何你用来测试运行正常JavaScript 项目的东西。

有一个official Google sample 可以使用此工作流程。

更多详情请见Google Apps Developer Blog post announcement。

下载文件后,通过将它们重命名为以 .ts 而不是 .js 结尾,将它们转换为 TypeScript。一旦它们是 TypeScript,ava 就可以用来测试它们。将它们转换为 TypeScript 还可以让人们使用 ES6 语言功能。

【讨论】:

表扣不允许您进行测试。 如果您使用 clasp,您可以在本地使用 Jasmine/Mocha 进行测试,因为您的文件是用 JS 编写的,然后使用 clasp push 翻译成 GAS。 OAuth2 Apps 脚本库使用 Mocha 进行测试:github.com/gsuitedevs/apps-script-oauth2 @Brian,将测试与平台分离有什么好处? @contributorpw 我在在线编辑器中的测试取得了不同程度的成功。 V8 运行时还真的减慢了日志消息的速度,这使得测试很难有效地进行。【参考方案4】:

查看 QUnitGS2 - 一个使用最新版本 QUnit (v2.10.1) 的新应用程序脚本库。

【讨论】:

【参考方案5】:

我创建了 gas-unit (https://code.google.com/p/gas-unit/),并在过去几天里花了一些时间整理示例并添加了一个 HTML 测试运行器。

我自己一直在使用它进行一些电子表格操作,并取得了相当大的成功。我也一直在将 Jasmine 用于非 GAS 客户端 js 工作,并且非常喜欢。我怀念 gas-unit 轻松创建间谍的能力,我更喜欢 BDD 风格的规范编写。

gas-unit 对我来说是一个很好的学习练习,它确实有效,尽管范围和闭包可能存在未发现的问题 - 这是我在 DOM 操作之外的第一个重要的 js 练习。

我认为在 GAS 中进行测试的未来必须使用 QUnit(正如 Adam 建议的那样)或 Jasmine 的端口。我快速浏览了一下移植 Jasmine 需要什么,但还没有找到时间来解决它。

【讨论】:

今晚我已经将我的测试从 gas-unit 转移到 QUnit for GAS,这相对轻松,我已经从 QUnit 的附加功能中受益。感谢亚当和其他贡献者。还发现了这个 jasmine runner link,它似乎有效,但可能更具实验性,但值得一看。 @adam 查看我提出的关于无法使用调试器的问题here【参考方案6】:

另一个用于在 Google Scripts 中进行单元测试的库是 GSUnit。

项目密钥:MIUhnnCDES0N3YHPEWX9DUtkh30YExdAc

GSUnit 是一个基于 JUnit 的基于 Google Apps Script 的测试框架 作者:Kent Beck 和 JSUnit,作者:Edward Hieatt

【讨论】:

我收到错误消息“缺少标识符为 GSUnit 的库的选定版本。(可能已被删除。)”。 GSUnit 停产了吗?

以上是关于如何对谷歌应用程序脚本进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何进行高效的Rails单元测试

如何在 Visual Studio 2005 中进行单元测试?

Iphone 单元测试错误:权限被谷歌工具箱拒绝

如何对第一个Vue.js组件进行单元测试 (上)

PySpark 单元测试方法

在 python 脚本中,如何忽略 Apache Pig 的 Python 装饰器以进行独立单元测试