首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中类内的变量声明

Swift中类内的变量声明
EN

Stack Overflow用户
提问于 2016-05-04 07:27:40
回答 3查看 2.2K关注 0票数 3

我是使用XCTest框架进行快速自动化测试的新手。在我的工作中,我面临着正确的排列,测试中的一些代码,请解释变量声明在类的开头和在某些函数中的区别。哪种方式更好?

Var.1

代码语言:javascript
复制
class someClass: XCTestCase {
   let app = XCUIApplication()

   func someFunc {
       print (app.debugdescription)
   }
}

Var。2

代码语言:javascript
复制
class someClass: XCTestCase { 

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-04 08:05:33

变量声明为Class级或函数级与其他编程语言相同,所以如果您了解它们的基本原理,那就太好了。

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-05-04 07:42:36

Var.1使您能够在setup()中配置XCUIApplication并在测试中使用它。如下所示:

代码语言:javascript
复制
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,您可以在每次测试中设置不同的应用程序。如下所示:

代码语言:javascript
复制
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)
   }
}
票数 2
EN

Stack Overflow用户

发布于 2016-05-04 08:37:43

这两种方法都是可能的,但var 2是首选的。对于var 1解决方案,请考虑以下场景:

代码语言:javascript
复制
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解

代码语言:javascript
复制
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)来确保在每次测试之前刷新它们的状态。

代码语言:javascript
复制
class TestClass: XCTestCase {
    var dep1: Dependency1!
    var dep2: Dependency2!

    var sut: SUT!

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

        sut = SUT(dep1, dep2)
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37021159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档