我需要建立一个脚本接口,做嵌入式固件的系统级测试我的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?