Я хочу, чтобы результаты веб-тестирования 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().

Другие вопросы по тегам