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


寻找 Apple 错误
Joseph 分享了一个巩固单元测试框架价值的早期轶事。
“在 JSL 单元测试框架的初始实施启动并运行后不久,它的价值以一种相当不寻常的方式显着显现出来。 有趣的是,它检测到的并不是 JMP 的回归,而是隔离 MacOS 中一个相当严重的错误的关键。
“2006 年初,Apple 开始将 Macintosh 产品线从 PowerPC CPU 过渡到 Intel CPU,为了帮助这一过渡,它捆绑了一个名为 Rosetta 的模拟器与 MacOS。 该模拟器允许 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 说。 “我很欣赏约瑟夫创建一个可以满足我们这么多人需求的框架的能力。”
位于 Cary 和北京的测试人员分担职能并监控 JMP 的某些区域。 但无论他们负责测试 JMP 的哪一部分,每个人基本上也在测试脚本语言。
Audrey 说:“我们使用 JMP 和 JSL 的次数越多,我们就会想到‘可有可无’。 尽管我们不是实施者,但有时我们会要求‘你能添加这个或那个吗?’”
当然,不断改进也会让客户受益。
“我们的高级 JSL 用户可能想要做一些我们正在做的事情。 它促使我们思考如何以更稳健的方式编写脚本。”
许多已添加的花里胡哨的东西都是从开发、测试和发布工程团队众包而来的。
感谢多年来增加功能的主要参与者:
约瑟夫·摩根@约瑟夫摩根
梅兰妮德雷克@Melanie_J_Drake
吉姆博雷克
赞格雷格@XanGregg
迈克尔赫克特@hecht_jmp
贾斯汀奇尔顿@贾斯汀奇尔顿
埃文麦科克尔@EvanMcCorkle
尼克·福尔摩斯@尼克霍姆斯13
这只是 JMP 部门的独创性、协作和对持续改进的承诺的众多例子之一。 我们希望突出更多这样的故事。 向杰西卡·马夸特 (Jessica Marquardt) 提出想法。
想了解更多信息?
JMP 测试仪表盘
测试工程经理 Nala Sun 撰写的这篇中国研发通讯文章( @娜拉) 为这篇文章提供了灵感: JSL 单元测试的自动化框架
以下是 JSL 单元测试结果是如何输出、处理和用于夜间单元测试运行的: JSL 框架数据管道
约瑟夫摩根的一篇文章: JSL 单元:自动化 JSL 测试
Orso、Alessandro 和 Gregg Rothermel。 “软件测试:研究游记 (2000–2014)。”软件工程会议的未来。 2014. 117-132.
Alex Orso 的专业页面: https://www.cc.gatech.edu/home/orso/
并感谢@shannon_conners提供背景和指导。
对单元测试框架过程的解释非常清楚,有很多人支持它。