扩展 C# .NET 应用程序 - 构建自定义脚本语言还是不构建?

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一起工作,以确定测试人员更喜欢使用哪种脚本。

9个回答

16
我听说IronPython非常适合这种情况。我愿意冒险花费几个小时来进行快速的概念验证,看看它的效果如何。
Michael Foord会很高兴地谈论在类似情况下使用IronPython的成功经验(特别是对于他而言,对于熟练使用电子表格的用户),他的书涵盖了一些关于从.NET进行托管的指针(如果我没记错的话)。

太好了 :) 有没有关于这种集成的好例子/教程?我很想看看类似这样的Python代码最终是什么样子。 - cgyDeveloper
我非常确定《IronPython实战》涵盖了一些内容(尽管它是纸质书,可能已经过时了);你可以在这里查看:http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx - Marc Gravell
我在我的博客上有一个示例,展示了如何使用Python脚本C#(或VB.NET)。链接为http://www.gotnet.biz/Blog/post/Mixing-Static-and-Dynamic-dotNET-Languages-November-2008-Update.aspx。 - W. Kevin Hazzard

10

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

编译流程直接由语言本身可扩展。

如果您想了解更多信息,阅读Boo宣言书是一个不错的起点。

[编辑] 我忘记提到Ayende Rahien正在撰写一本完整的书籍: 在Boo中构建领域特定语言


4

在考虑这种任务时,可能值得考虑PowerShell。它像DLR语言一样可以调用.Net,并且在其命令行概念中为任务提供了更自然的语言类型划分。您必须在v1中使用编译语言编写cmdlets。在v2中(从Win7开始推出,并在接下来的几个月中向旧版发布),您可以直接在PowerShell中构建。


2
从您选择的DSL来看,我建议使用IronRuby的CUCUMBER。
使用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

您可以很容易地将这种语言适应于您的需求。 只需搜索“Cucumber和IronRuby”,您就会找到几篇指南和博客文章来帮助您入门。


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#方法之一,在配置设置中使用起来非常自然。


这看起来真的很棒。你是如何使MAX()函数看起来与脚本本地化的?我的问题现在是,我不想让.NET风格的类到处都是。每个示例都像SomeClass.Max(),而我只想要像你一样的基本脚本... - cgyDeveloper
如果您看到了这条评论,也许您可以在https://dev59.com/AnM_5IYBdhLWcg3wgzdl上为我的新/相关问题提供答案。 - cgyDeveloper

2

我同意Marc G的观点,不过值得一提的是这个概念的总体思想是特定领域语言。虽然IronRuby/IronPython并非严格的领域特定语言,但它们功能完备,可以帮助你进行实现。

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

但是,确实应该试试IronPython。


每天我都会学习一个新的缩写词...DSL现在已经成为了我的词汇量之一(两次)。谢谢,你只是通过这个就帮助我大大提高了谷歌搜索的效率 :) - cgyDeveloper

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

这是我们的测试人员目前正在使用的一种DSL,用于编写针对UI的自动化测试的示例

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而不是创建自己的自定义语言...这样你将节省难以想象的努力(和错误)。


感谢您的回答。我个人想选择IronRuby(因为它有无括号语法),但最终还是选择了IronPython,因为它更成熟。两者都是非常好的选择,但在我的初始测试阶段中,我遇到了更多IronRuby的问题。 - cgyDeveloper

0

我以前做过这个,但这并不是我想要的。使用C#,你需要至少声明一个类和一个成员函数,因此无法编写与我的示例相似的脚本。 - cgyDeveloper
@Kiquenet,这很不幸。但是你仍然可以通过Wayback Machine访问它:https://web.archive.org/web/20150303092513/http://www.crowsprogramming.com/archives/99 - Chris

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接