扩展C#.NET应用程序 - 建立一个自定义的脚本语言或不?(Extending C# .NET a

2019-07-03 14:45发布

我需要建立一个脚本接口,做嵌入式固件的系统级测试我的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的,嘘和IronRuby的,看看有什么测试者宁愿在写剧本。

Answer 1:

我听说过IronPython的非常好的东西正是这种类型的情况。 我一定会在风险快速验证的概念,花了几个小时,看看它是如何平移出来。

迈克尔Foord会很乐意和抒发的IronPython的在类似案件中获得成功(最专门为他,为电子表格精明的用户),和他的书封面(IIRC)约.NET托管这几个指针。



Answer 2:

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

编译流水线从语言本身直接扩展。

读嘘宣言是一个很好的起点,如果你想了解更多相关信息。

[ 编辑 ]我忘了提, Ayende Rahien是在话题写一本完整的书: 在嘘建筑领域特定语言



Answer 3:

这可能是值得考虑的PowerShell对这种任务的。 这可以调用的.Net就像任何DLR的语言,并具有更自然的语言类型分块在其小命令(命令让)概念的任务。 你必须在V1写在编译语言的cmdlet - 其中正在推出V2开始Win7和(现V2为Vista / Win2k8在RC)在未来数月工作,更早的版本,你可以建立这些在PowerShell中直接。



Answer 4:

我同意马克·G,但它是值得一提的是,一般的概念是一个特定领域Langugage。 虽然IronRuby中/ IronPython的不严格特定领域的,他们是全功能的,它将让你获得与您的实现。

Visual Studio中有DSL工具,而且也对“M”语法的东西,你可以看看。

但是,是的,IronPython的。



Answer 5:

从你要去的DSL,我建议用黄瓜IronRuby的。

黄瓜,测试人员编写看起来像一个测试:

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

这是很容易使这种语言满足您的需要。 只是谷歌“黄瓜和IronRuby”,你会发现一些指南和博客文章,让你开始。



Answer 6:

我们使用的是嵌入式铁的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

这实在是容易实现。 例如马克斯()函数只是我们导入到IronPython的引擎自定义的C#方法之一,它看起来自然在配置设置才能使用。



Answer 7:

你可以只使用C#本身作为脚本语言如这里所描述CrowsProgramming -在.net运行脚本



Answer 8:

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的打算......你可以节省力气了难以想象的量(和错误)



Answer 9:

具有讽刺意味的也可能是这里一个很好的候选人。 这里是一个创造了在飞行中给定的动漫形象的例子。

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的反讽



文章来源: Extending C# .NET application - build a custom scripting language or not?