проблемы с выполнением юнит-тестов Selenium python на C# с помощью ScriptEngine (.NET 3.5)

постер первый раз.

Я перехожу к своему первому вопросу о переполнении стека, потому что я нашел мало ресурсов, пытаясь найти ответ. Я хочу выполнить тесты Python Selenium из приложения С#. Я не хочу каждый раз компилировать тесты C# Selenium; Я хочу воспользоваться преимуществами сценариев IronPython для динамического тестирования селена. (примечание: у меня мало опыта работы с Python или ScriptEngine и т. д.)

Selenium выводит юнит-тесты на питоне в следующем виде:

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 и запускает тест.

Я не могу добиться того же результата, используя ScriptEngine и др. API в С#, .NET 3.5, и я думаю, что это связано с невозможностью выполнить функцию main(). Я предполагаю, что следующий код:

if __name__ == "__main__":
    unittest.main()

Я пробовал engine.ExecuteFile(), engine.CreateScriptSourceFromString()/source.Execute() и engine.CreateScriptSourceFromFile()/source.Execute(). Я попробовал scope.SetVariable("__name__", "__main__"). Я получаю некоторый успех, когда я комментирую часть if __name__ файла py и вызываю engine.CreateScriptSourceFromString("unittest.main(module=None") после того, как engine.Runtime.ExecuteFile() вызывается в файле py. I' Я пытался сохранить результаты в python и получить к ним доступ через scope.GetVariable().Я также пытался написать функцию python, которую я мог бы вызывать из C # для выполнения модульных тестов.

(движок — это экземпляр ScriptEngine, источник — экземпляр ScriptSource и т. д.)

Мое незнание Python, ScriptEngine или модуля unittest вполне может быть причиной моих проблем. Удалось ли кому-нибудь выполнить модульные тесты Python с использованием API ScriptEngine и т. Д. В С#? Кто-нибудь успешно выполнил «основной» код из ScriptEngine?

Кроме того, я читал, что в unittest есть средство запуска тестов, которое поможет получить доступ к ошибкам через объект TestResult. Я считаю, что синтаксис следующий. Я еще не добрался сюда, но знаю, что мне нужно собрать результаты.

unittest.TextTestRunner(verbosity=2).run(unittest.main())

Заранее спасибо. Я подумал, что лучше иметь больше деталей, чем меньше. =П


person kdawg    schedule 03.11.2009    source источник


Ответы (2)


Глядя на исходный код для консоли IronPython (ipy.exe), он выглядит так: в конечном итоге это сводится к вызову 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()

Запуск этого напечатает «это main».

person Jeff Hardy    schedule 03.11.2009

Попробуйте следующее:

unittest.main(module=__name__)
person Tom E    schedule 13.04.2011