9

我试图弄清楚如何让 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
4

2 回答 2

6

我现在可以工作了。我将以下内容放在每个测试的 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

当用户想要在 canopy 周围使用不同的单元测试基础架构时,在 canopy 中包含一些可以调用或配置的东西可能是有意义的。

此外,我希望包含错误信息的输出在测试失败时正常显示,因此我在 stringBuilder 中捕获 console.out 并在 [] 中清除它。我通过包含以下 [] 来设置它,其中 common.results 是我然后在断言中使用的 StringBuilder。

    System.Console.SetOut(new System.IO.StringWriter(common.results))
于 2015-06-24T16:31:48.333 回答
0

创建一个可变类型以传递给“myTestModule.all”调用,该调用可以在失败时相应更新,并在“run()”完成后断言。

于 2014-08-15T12:21:58.990 回答