12

我需要为我的 C# 程序构建一个脚本接口,用于对嵌入式固件进行系统级测试。

我的应用程序包含与设备完全交互的库。有单独的库用于启动操作、获取输出和跟踪成功/失败。我的应用程序还有一个 GUI,用于管理多个设备并分配许多要运行的脚本。

对于测试人员(非程序员,但技术人员),我需要提供一个脚本接口,使他们能够提出不同的测试场景并运行它们。他们只是要调用我的 API,然后将结果返回给我的程序(通过/失败和消息)。

我想要的一个非常基本的例子:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
IF GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
ELSE
  REPORT_FAIL "Failed to tune to " + frequency
ENDIF
TURN_POWER_OFF

我的 C# 库提供了报告、功率和频率功能。

IronRuby 或 IronPython 之类的东西会对此有好处,还是我应该构建自己的非常基本的语言?

尝试包含一堆 .NET 编译的程序集时,Ruby/Python 代码是否会变得混乱?我希望它对非程序员和程序员一样易于学习和编码。

编辑:

感谢所有伟大的回应。我选择 IronPython 作为答案,因为它有最多的支持,但我会花一些时间来了解 IronPython、Boo 和 IronRuby 中的每一个,看看测试人员更喜欢用什么来编写脚本。

4

9 回答 9

16

对于这种类型的场景,我听说 IronPython 非常好我肯定会冒险花几个小时进行快速的概念验证,看看结果如何。

Michael Foord 会很高兴地对 IronPython 在类似情况下的成功进行抒情(尤其是对他而言,对于精通电子表格的用户),他的书涵盖了 (IIRC) 关于从 .NET 托管它的一些建议。

于 2009-08-24T21:42:56.517 回答
10

您可能想看看Boo,这是另一种在 CLR 上运行的托管语言,它特别适合构建 DSL 并使您的应用程序可编写脚本。

编译管道可以直接从语言本身扩展。

如果您想了解更多信息,阅读Boo Manifesto是一个很好的起点。

[编辑] 我忘了提到Ayende Rahien正在写一本关于该主题的完整书籍: Building Domain Specific Languages in Boo

于 2009-08-24T21:54:51.343 回答
4

对于此类任务,可能值得考虑使用 PowerShell。它可以像任何 DLR 语言一样调用 .Net,并且在其 cmdlet(command-let)概念中为任务提供更自然的语言类型分块。您必须在 v1 中以编译语言编写 cmdlet - 在 v2 中,该版本从 Win7 开始推出,并在接下来的几个月内适用于旧版本(Vista/Win2k8 的 v2 现在在 RC 中),您可以构建这些直接在 PowerShell 中。

于 2009-08-24T21:58:24.583 回答
2

我同意 Marc G 的观点,但值得一提的是,一般概念是特定领域的语言。虽然 IronRuby/IronPython 不是严格特定于域的,但它们功能齐全,可以让您继续执行您的实现。

Visual Studio 有 DSL 工具,还有你可以研究的“M”语法。

但是,是的,IronPython。

于 2009-08-24T21:54:20.317 回答
2

从您要使用的 DSL 中,我建议将 CUCUMBER 与 IronRuby 一起使用。

使用 Cucumber,测试人员可以编写如下所示的测试:

Scenario: See all vendors
Given I am logged in as a user in the administrator role
And There are 3 vendors
When I go to the manage vendors page
Then I should see the first 3 vendor names

使这种语言适合您的需求非常容易。只需 google 一下“Cucumber and IronRuby”,您就会找到一些指南和博客文章来帮助您入门。

于 2009-08-25T03:55:21.970 回答
2

我们在我们的一个项目中使用嵌入式 Iron Python 定价公式。这就是真实样本的外观。

E_DOCUMENT_CHECK = DCPAV * ADS_NUM
E_SPECIFIC_TAX = STV
E_RESOURCE_DEV = RDV
E_LP_ISSUANCE = LPIV
E_ANNUAL_FEES = APFCV * SA * SIDES_NUM
E_SERVICE_FEES= MAX(
MINSFV,
E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES)
TOTAL= E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES+E_SERVICE_FEES

实施起来非常简单。例如,Max() 函数只是我们导入 IronPython 引擎的自定义 C# 方法之一,在配置设置中使用它看起来很自然。

于 2009-08-26T20:05:13.837 回答
0

您可以将 C# 本身用作脚本语言,如此处所述CrowsProgramming - Runtime Scripting in .Net

于 2009-10-01T15:19:57.097 回答
0

IronRuby 是创建领域特定语言的最强大的语言,因为它的语法比 python 的更灵活和宽容(你的用户会搞砸空格并被强制的 () 调用方法惹恼)。

您可以在 IronRuby 中编写示例脚本,它看起来像这样:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
if GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
else
  REPORT_FAIL "Failed to tune to " + frequency
end
TURN_POWER_OFF

这是我们的测试人员目前用来针对我们的 UI 编写自动化测试的 DSL 示例

window = find_window_on_desktop "OurApplication"
logon_button = window.find "Logon"
logon_button.click

list = window.find "ItemList"
list.should have(0).rows

add_button = window.find "Add new item"
add_button.click
list.should have(1).rows

然而,就目前的情况来看,IronPython 比 IronRuby 更成熟,性能也更好,所以你可能更喜欢使用它。

我强烈建议您使用 IronPython 或 IronRuby,而不是创建自己的自定义语言……您将节省难以想象的工作量(和错误)

于 2009-11-03T22:46:00.473 回答
0

讽刺在这里也可能是一个很好的候选人。这是一个为给定图像动态创建动画的示例。

Set camera size: 400 by 300 pixels.
Set camera position: 100, 100.
Move 200 pixels right.
Move 100 pixels up.
Move 250 pixels left.
Move 50 pixels down.

创建此类 DSL 的教程在这里:编写您的第一个领域特定语言

这是一个旧教程,但作者仍然在这里维护他的库:Github Irony

于 2019-03-05T09:44:29.337 回答