显而易见的是:我们并不是所有人都适合从事研发工作。但我们仍然可以学习一些术语。这里有一个短语:JSL 单元测试框架。它是什么?它是如何诞生的?为什么它很重要?
让我们揭开 JSL 单元测试框架的神秘面纱。
感谢高级分析测试高级经理 Nicole Jones( @Nicole_Jones )的解释:
“术语‘单元’是指软件产品中最小的可测试组件,‘单元测试’是指验证过程,以确保单元按预期运行。‘单元测试框架’是指用于促进自动化单元测试的机制。”
首席研究统计员 Joseph Morgan( @joseph_morgan )在 2005 年开始担任统计测试员时将这些术语引入了 JMP。(他现在在 DOE 小组工作。)Joseph 的背景是软件工程和计算机科学,以及离散数学和统计学。
“他构思了整个概念,一个中央测试框架,”测试工程高级经理 Audrey Shull ( @Audrey_Shull ) 说道。“他有很多伟大的想法,这是其中之一。”
“一旦他熟悉了 JMP 和 JSL,他就能够开发 JSL 单元测试框架,同时牢记软件的统计性质,”Nicole 说。
Joseph Morgan 解释 (4:38)
“喝我们自己的香槟”
单元测试框架可以用其他语言编写,但还有什么比我们自己的 JSL 更好的工具呢?
借助 JSL 单元测试框架,“我们使用 JMP 来测试 JMP”,Audrey 解释道。换句话说,我们“喝着自己的香槟”。而这并非是所有工具都能够做到的。
“我们可以使用我们的软件来测试我们的软件,因为我们拥有这种多功能的 JSL 语言,”Audrey 继续说道。“我们扩展了 JSL 的功能以支持该框架。这是一件非常特别的事情。而且该框架本身可以作为 JSL 向后兼容性的大型回归测试。
“如果开发人员改变了脚本的工作方式,测试小组会首先发现,因为我们是 JSL 语言的第一个客户。
“所有公司都尝试使用自动化,但他们通常会使用其他第三方工具来实现这一点。他们并不总是有条件使用自己的软件。”
可扩展的框架
A screenshot of the original dialog.原始对话框的屏幕截图。JSL单元测试框架在所有 JMP 平台上使用。例如,它可用于测试 Graph Builder 中的拖放功能。或红色三角形菜单。或 Distribution 平台中的任何代码单元。
“我们不仅用它来测试 JSL 本身,而且还可以用该框架来测试所有其他平台,”Audrey 说。
Nicole 进一步解释道:
“当 Joseph 开发框架时,他的主要重点是找到一种方法来为 JMP 中的统计平台创建回归测试套件。然而,他能够创建一个可扩展的框架 - 回归测试套件包括统计平台和图形平台,它适用于 Macintosh 和 Windows,它测试数据表命令以及报告结构。”
利用“安全网”
该框架可以手动运行——测试人员和开发人员可以启动、点击并运行。但自动化是持续改进的关键。
该框架通过 Perforce(工作存储库)实现自动化,开发人员的工作存放在此,代码在此实现。JMP 测试人员编写测试用例并将其上传到 Perforce 中的专用部分。
Screenshot of the testing dialog as it looks today.今天的测试对话框的屏幕截图。
首席系统开发人员 Jim Borek 运行的夜间自动化流程会抓取当天上传的所有测试、抓取当天推送的所有代码、在更新的代码上运行测试用例,并在出现任何故障时通知团队。Jim 是实现此流程自动化和维护机器的核心。
奥黛丽描述了测试的规模:每晚要执行 240 万次测试。这发生在每个操作系统(例如 Windows、Catalina、BigSur)上,适用于 JMP 17 和 JMP 16.2。在一台机器上运行测试的过程需要 6-10 小时,具体取决于机器的运行速度。
“这就是回归测试套件——如果没有这个框架,我们就必须每天测试这些东西,看看它们是否出问题,”奥黛丽说。“这不能是手动的。这套测试是自动化的,因此系统会在发生故障时提醒我们。
“我们有时喜欢称其为安全网。我知道上次测试时它是否有效,我编写了一个测试用例,如果它崩溃了,系统会通知我。我可以继续做其他事情。我们正在尝试测试软件中新增和即将添加的功能。”
JSL 测试框架工作流程


发现一个苹果漏洞
约瑟夫分享了一个早期的轶事,巩固了单元测试框架的价值。
“JSL 单元测试框架的初始实施启动并运行后不久,其价值就以一种相当不寻常的方式得到了显著体现。有趣的是,它检测到的并不是 JMP 的回归,而是隔离 MacOS 中一个相当严重的错误的关键。
“2006 年初,Apple 开始将 Macintosh 产品线从 PowerPC CPU 过渡到 Intel CPU,为了帮助实现这一过渡,Apple 在 MacOS 中捆绑了一个名为 Rosetta 的模拟器。该模拟器允许 PowerPC 应用程序在 Intel Mac 上运行,因此被 Apple 视为一款关键软件。
“事实证明,Rosetta 模拟器中有一个错误,导致 JMP 的行为出现一些异常。借助单元测试框架,我能够将问题隔离到 Rosetta 中平方根函数实现中的一个错误( 参见缺陷 S0351925 )。
“Michael Hecht 和我与 Apple 工程师进行了几次电话会议来解释这个问题,但工程师们坚持认为这是一个 JMP 错误。直到 Michael 建议我编写一个非常简单的 C++ 应用程序,基本上模仿一个展示该错误的单元测试,Apple 才确信这个问题是一个 Rosetta 错误。一年后,即 2007 年 3 月,Apple 发布了 Mac OS X 10.4.8 中 Rosetta 错误的修复程序。”
谁受益?
“[该框架] 是为测试人员开发的,但事实证明对开发人员也很有用,”Nicole 说。“我很欣赏 Joseph 能够创建一个能够满足我们许多人需求的框架。”
位于卡里和北京的测试人员分担功能并监控 JMP 的某些区域。但无论他们负责测试 JMP 的哪个部分,每个人实际上都在测试脚本语言。
Audrey 说道:“我们使用 JMP 和 JSL 的次数越多,我们就越觉得它们是‘好东西’。尽管我们不是实施者,但有时我们也会提出请求‘您能添加这个或那个吗?’”
当然,持续的改进会让客户受益。
“我们的高级 JSL 用户可能想要做一些我们正在做的事情。这促使我们思考如何以更强大的方式编写脚本。”
大量新增的功能都是由开发、测试和发布工程团队众包而来的。
向多年来增加功能的关键参与者致敬:
约瑟夫·摩根@joseph_morgan
梅兰妮德雷克@Melanie_J_Drake
吉姆·博雷克
Xan Gregg @XanGregg
迈克尔·赫克特@hecht_jmp
贾斯汀·奇尔顿@Justin_Chilton
埃文·麦考克尔@EvanMcCorkle
尼克·霍姆斯@nickholmes13
这只是 JMP 部门的独创性、协作和持续改进承诺的众多案例之一。我们希望能推出更多类似的故事。请联系 Jessica Marquardt 提出想法。
想要更多信息吗?
JMP 测试仪表板
测试工程经理 Nala Sun( @Nala )撰写的《中国研发快讯》文章为本文提供了灵感: JSL 单元测试的自动化框架
以下是 JSL 单元测试结果的输出、处理和利用方式,用于夜间单元测试运行: JSL 框架数据管道
Joseph Morgan 的文章: JSL 单元:自动化 JSL 测试
Orso, Alessandro 和 Gregg Rothermel。“软件测试:研究游记 (2000–2014)。”未来软件工程论文集。2014 年。117-132。
Alex Orso 的专业页面: https://www.cc.gatech.edu/home/orso/
并感谢@shannon_conners提供背景和指导。
非常清晰地解释了单元测试框架流程,并拥有一支优秀的团队支持它。