第一次海报。
我现在转向有关堆栈溢出的第一个问题,因为在寻找答案时我发现资源很少。我正在寻找从C#应用程序执行Selenium python测试。我不想每次都编译C#Selenium测试。我想利用IronPython脚本进行动态selenium测试。(注意:我几乎没有Python或ScriptEngine等经验。)
Selenium以以下形式在python中输出单元测试:
from selenium import selenium import unittest class TestBlah(unittest.TestCase): def setUp(self): self.selenium = selenium(...) self.selenium.start() def test_blah(self): sel = self.selenium sel.open("http://www.google.com/webhp") sel.type("q", "hello world") sel.click("btnG") sel.wait_for_page_to_load(5000) self.assertEqual("hello world - Google Search", sel.get_title()) print "done" def tearDown(self): self.selenium.stop() if __name__ == "__main__": unittest.main()
我可以使用ipy.exe从命令行运行它,没问题:
ipy test_google.py
而且我可以看到Selenium Server启动了一个firefox浏览器实例并运行了测试。
使用C#、. NET 3.5中的ScriptEngine等API时,我无法获得相同的结果,我认为它的中心在于无法执行main()函数,我猜下面的代码是:
if __name__ == "__main__": unittest.main()
我尝试过engine.ExecuteFile(),engine.CreateScriptSourceFromString()/ source.Execute()和engine.CreateScriptSourceFromFile()/ source.Execute()。我尝试了scope.SetVariable(“ __name__”,“ __main__”)。当我注释掉__name__py文件的if 部分并在py文件上调用engine.Runtime.ExecuteFile()之后调用engine.CreateScriptSourceFromString(“ unittest.main(module = None”))时,我确实获得了一些成功。尝试将结果存储在python中并通过scope.GetVariable()访问它们,我还尝试编写一个可以从C#调用以执行单元测试的python函数。
__name__
__main__
(引擎是ScriptEngine的实例,来源是ScriptSource的实例,等等。)
我对Python,ScriptEngine或unittest模块的无知很容易成为我的麻烦的根源。有谁有运气使用C#中的ScriptEngine等API执行python单元测试?有没有人成功地从ScriptEngine执行“主要”代码?
另外,我读到unittest有一个测试运行程序,它将帮助通过TestResult对象访问错误。我相信语法如下。我还没到这里,但是知道我需要收获结果。
unittest.TextTestRunner(verbosity=2).run(unittest.main())
提前致谢。我认为最好有更多细节而不是更少细节。= P
查看IronPython控制台(ipy.exe)的源代码,看起来最终可以归结为call ScriptSource.ExecuteProgram()。您可以ScriptSource从任何一种ScriptEngine.CreateScriptSourceFrom*方法中获得一个。
ScriptSource.ExecuteProgram()
ScriptSource
ScriptEngine.CreateScriptSourceFrom*
例如:
import clr clr.AddReference("IronPython") from IronPython.Hosting import Python engine = Python.CreateEngine() src = engine.CreateScriptSourceFromString(""" if __name__ == "__main__": print "this is __main__" """) src.ExecuteProgram()
运行此命令将打印“ this is main ”。