Swift中类内的变量声明

时间:2016-05-04 07:27:40

标签: swift xctest

我是使用XCTest框架进行快速自动化测试的新手。 在我的工作中,我面对正确安排测试中的一些代码部分 请解释在类的开头和特定函数中变量声明之间的区别。哪种方式更受欢迎?

Var.1

class someClass: XCTestCase { 

 func someFunc {
       let app = XCUIApplication()
       print (app.debugdescription)
   }
}

无功。 2

future map(r => println(r)) recover { 
  case arithmeticException => log("arithmetic exception")
  case NonFatal(e) => log(e)
}

3 个答案:

答案 0 :(得分:2)

<强>无功。 1 使您能够在XCUIApplication中配置setup()并在测试中使用它。像这样:

class someClass: XCTestCase {
   var app: XCUIApplication!

   func setUp {
      app = XCUIApplication()
      app.launchArguments.append("launchArgument")
      setupSnapshot(app)
      app.launch()
   }

   func test1 {
      XCTAssertNotNil(app)
   }

   func test2 {
      XCTAssertNotNil(app)
   }
}

使用 Var。 2 您可以在每次测试中以不同方式设置应用。像这样:

class someClass: XCTestCase {

   func test1 {          
      let app = XCUIApplication()
      app.launchArguments.append("withTestUser")
      app.launch()

      XCTAssertNotNil(app)
   }

   func test2 {          
      let app = XCUIApplication()
      app.launchArguments.append("withNoData")
      app.launch()

      XCTAssertNotNil(app)
   }
}

答案 1 :(得分:2)

两种方式均可行,但 var 2是首选。对于 var 1 解决方案,请考虑以下情形:

class State {
    var val: Int = 0
}

class TestClass: XCTestCase {
    let state = State()

    func test1() {
        state.val = 5

        XCTAssertEqual(5, state.val)
    }

    func test2() {
        XCTAssertEqual(0, state.val)
    } 
}

这种结果取决于首先运行的测试。如果test2是第一个,那么两个测试都会成功。其他方式,第二次测试将失败。

var 2 解决方案

class TestClass: XCTestCase {
    func test1() {
        let state = State()            

        state.val = 5

        XCTAssertEqual(5, state.val)
    }

    func test2() {
        let state = State() 

        XCTAssertEqual(0, state.val)
    } 
}

无论首先运行什么测试,两个测试都会成功。这使得 var 2 解决方案在大多数情况下都是首选。

有一种情况, var 1 var 2 方便。当SUT具有许多依赖关系时,您必须在每个测试中复制并粘贴它们的创建代码。然后,您可以将依赖项声明为类变量,但必须使用测试setUp(可能还有tearDown)以确保在每次测试之前刷新其状态

class TestClass: XCTestCase {
    var dep1: Dependency1!
    var dep2: Dependency2!

    var sut: SUT!

    func setUp() {
        dep1 = Dependency1()
        dep2 = Dependency2()

        sut = SUT(dep1, dep2)
    }
}

答案 2 :(得分:1)

变量声明为类级别或函数级别与其他编程语言相同,因此如果您了解它们的基本原理会很好。

类级别变量意味着可以在整个类中访问此变量,这意味着它可以在同一个类的任何函数中使用。这也意味着如果您将类设置为public,并将该变量设置为public,那么一旦初始化了类,就可以在其他类的程序中访问它。 通常如果你没有正确管理它们就会产生内存问题,因为当类本身在内存中时它们会留在内存中。

功能级变量只能在该特定功能中访问,不能在该功能之外访问,无论它是同一个类还是不同的类,它们在其功能之外没有引用。 通常它们不会在整个程序中产生内存问题,因为这些变量会在完全执行该函数时离开内存。