2016-05-04 18 views
3

私はXCTestフレームワークを使用した迅速な自動テストでは新しいです。 私の仕事では、正しい配置に直面していました。テスト中にコードの一部がありました。 クラスの始めと特定の関数の変数宣言の違いについて説明してください。どちらの方法が好まれますか?Swiftのクラス内の変数宣言

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

クラスレベルまたは機能レベルとして変数宣言は、他のプログラミング言語と同じです。

クラスレベルの変数は、この変数がクラス全体でアクセスできることを意味します。つまり、同じクラスのどの関数でも使用できます。また、クラスをパブリック、その変数をパブリックとして設定すると、クラスが初期化されると、他のクラスのプログラム内でアクセスできるようになります。 通常クラス自体がメモリ内にあるときにメモリに残り、正しく管理しないとメモリの問題が発生する可能性があります。

ファンクションレベルの変数は、その特定のファンクション内でのみアクセスでき、そのファンクションの外部であっても、同じクラスであっても別のクラスであっても、そのファンクションの外部には参照がありません。 通常これらの変数は、その関数が完全に実行されたときにメモリから離れるため、プログラム全体でメモリの問題を引き起こすことはありません。

1

Var。 1XCUIApplicationsetup()に設定し、テストで使用することができます。このように:

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

最初の例は、コンパイルされません前に、それらの状態が更新されることを保証することができます'app'を定数として使用し、' setUp'でその値を変更しようとしています –

+0

@ MaximKosovありがとう、更新済み – Daniel

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が最初の場合、両方のテストが成功します。他の方法では、2番目のテストは失敗します。 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) 
    } 
} 
関連する問題