Swift 中 class 内的变量声明

Variable declaration inside of class in Swift

我是 swift 使用 XCTest 框架进行自动化测试的新手。 在我的工作中,我面临着正确安排测试中的某些代码部分 请解释class开头的变量声明和某个函数中的变量声明的区别。首选哪种方式?

Var.1

class someClass: XCTestCase {
   let app = XCUIApplication()

   func someFunc {
       print (app.debugdescription)
   }
}

变量。 2

class someClass: XCTestCase { 

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

变量。 1 使您能够在 setup() 中配置 XCUIApplication 并在测试中使用它。像这样:

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)
   }
}

可变。 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)
   }
}

Class级别或Function级别的变量声明与其他编程语言相同,如果能了解它们的基本原理就更好了。

Class级变量表示这个变量在整个class中都可以访问,也就是可以在同class的任何函数中使用=26=]。这也意味着,如果您将 class 设置为 public,并将该变量设置为 public,那么一旦 class 被初始化,它就可以在您的程序中的其他 classes。 通常如果您没有正确管理它们,它们可能会造成内存问题,因为当 class 本身在内存中时它们会留在内存中。

函数级变量只能在该特定函数内访问,而不能在该函数外访问,无论它是相同的class还是不同的class,它们在它们的功能之外没有参考。 通常它们不会在您的整个程序中造成内存问题,因为这些变量会在该函数完全执行后离开内存。

两种方式都可以,但 首选 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 1var 2 方便。这是当 SUT 有很多依赖项并且您必须在每个测试中为它们复制和粘贴创建代码时。然后你可以将依赖声明为一个class变量,但是你必须使用测试setUp(可能还有一个tearDown)来确保它们的状态是每次测试前刷新

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

    var sut: SUT!

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

        sut = SUT(dep1, dep2)
    }
}