Я хочу, чтобы результаты веб-тестирования Canopy отображались в проводнике тестов VS 2013... и я ТАК ЗАКРЫТ
Я пытаюсь выяснить, как получить результаты теста Canopy для отображения в проводнике тестов VS. Я могу показать свои тесты, и они будут запущены, но они всегда показывают проход. Кажется, что функция Run() "съедает" результаты, поэтому VS никогда не видит сбой.
Я уверен, что это конфликт между тем, как Canopy хорошо интерпретирует исключения, которые попадают в результаты теста, потому что обычно вы хотите, чтобы Run() выполнялась успешно независимо от результата и сообщала о своих результатах, используя свои собственные отчеты.
Может быть, я должен перенаправить вывод и интерпретировать это в коде тестирования MS?
Итак, вот как я настроил это прямо сейчас...
Visual Studio Test Runner ищет в этом файле то, что он видит как тесты, они вызывают методы canopy, которые выполняют реальное тестирование.
open canopy
open runner
open System
open Microsoft.VisualStudio.TestTools.UnitTesting
[<TestClass>]
type testrun() =
// Look in the output directory for the web drivers
[<ClassInitialize>]
static member public setup(context : TestContext) =
// Look in the output directory for the web drivers
canopy.configuration.ieDir <- "."
canopy.configuration.chromeDir <- "."
// start an instance of the browser
start ie
()
[<TestMethod>]
member x.LocationNoteTest() =
let myTestModule = new myTestModule()
myTestModule.all()
run()
[<ClassCleanup>]
static member public cleanUpAfterTesting() =
quit()
()
myTestModule выглядит так
open canopy
open runner
open System
type myTestModule() =
// some helper methods
member x.basicCreate() =
context "The meat of my tests"
"Test1" &&& fun _ ->
// some canopy test statements like...
url "http://theURL.com/"
"#title" == "The title of my page"
//Does the text of the button match expectations?
"#addLocation" == "LOCATION"
// add a location note
click ".btn-Location"
member x.all() =
x.basicCreate()
// I could add additional tests here or I could decide to call them individually
2 ответа
У меня это работает сейчас. Я поставил ниже после run() для каждого теста.
Assert.IsTrue(canopy.runner.failedCount = 0,results.ToString())
так что теперь мои тесты выглядят примерно так:
[<TestMethod>]
member x.LocationNoteTest() =
let locationTests = new LocationNote()
// Add the test to the canopy suite
// Note, this just defines the tests to run, the canopy portion
// of the tests do not actually execute until run is called.
locationTests.all()
// Tell canopy to run all the tests in the suites.
run()
Assert.IsTrue(canopy.runner.failedCount = 0,results.ToString())
Canopy и инфраструктура UnitTesting имеют некоторое совпадение в том, что они хотят позаботиться. Я хочу, чтобы инфраструктура UnitTesting была "отчетной" для сводки всех тестов и деталей, поэтому мне нужно было найти способ "сбросить" часть купола, чтобы мне не приходилось отслеживать последнее известное состояние из купола, а затем сравнить. Поэтому, чтобы это работало, в вашем наборе куполов может быть только один тест, но мы хотим иметь столько, сколько хотим на уровне UnitTesting. Чтобы приспособиться к этому, мы делаем ниже в [].
runner.suites <- [new suite()]
runner.failedCount <- 0
runner.passedCount <- 0
Может иметь смысл иметь что-то внутри купола, которое можно вызывать или настраивать, когда пользователь хочет использовать другую инфраструктуру модульного тестирования вокруг купола.
Кроме того, я хотел, чтобы вывод, содержащий информацию об ошибке, отображался как обычно, когда тест не пройден, поэтому я записываю console.out в stringBuilder и очищаю его в []. Я настроил это, включив ниже [], где common.results - это StringBuilder, который я затем использую в утверждениях.
System.Console.SetOut(new System.IO.StringWriter(common.results))
Создайте изменяемый тип для передачи в вызов myTestModule.all, который может быть обновлен соответствующим образом в случае сбоя и подтвержден после завершения run().