blob: 57df1dfbaaad215090921e25bf76c6af5410fc1c [file] [view]
**Note:** We're releasing the EarlGrey 2.0 source code with Xcode Project Integration
as of now. The open-source version is currently in Beta. As we proceed over the
coming quarters, we'll add support for CocoaPods and Carthage as well. Please
peruse the code and do bring forward any issues or concerns you might have with
migrating your EarlGrey 1.0 tests to 2.0. We're looking forward to provide
improvements over the following quarters.
# Using EarlGrey 2.0
EarlGrey 2.0 uses XCUITest which runs tests in a separate process than the
application. As a result of this, we need to have two different EarlGrey
components - one for the test and one for the application. On opening the
[EarlGrey.xcodeproj](../EarlGrey.xcodeproj) file, you will find four components -
* **CommonLib** - A static library containing sources that will be linked into
both the test and app process.
* **UILib** - A static library containing utilities for performing UI checks
such as visibility checks, screenshots, traversing the hierarchy.
* **TestLib** - A static library containing Test Component utilities and
additions for EarlGrey. Also contains Distant Objects that tunnel calls from
the test to the application process. **This must be linked to the test
target.**
* **AppFramework** - A framework that contains App Component EarlGrey sources
related to synchronization, actions, and assertions. Also contains
DistantObject utilities for transporting errors etc. back to the test for
reporting.
These components are structured in the following way for the application component
and the test component.
<img src="images/components.png">
## 1. Steps to add EarlGrey 2.0 to your tests using Xcode
Clone the EarlGrey project to your workspace.
```
// Clone EarlGrey 2.0
git clone -b earlgrey2 https://github.com/google/EarlGrey.git
// Download any dependencies. Run this command from the EarlGrey/ root directory
// as it will download the submodules in the root of the Git repository it is called from.
sh Scripts/download_deps.sh
```
On doing so, your folder structure inside the EarlGrey repository should look
like the following:
```
AppFramework/
CommonLib/
TestLib/
UILib/
Tests/
README.md
LICENSE
EarlGrey.xcodeproj
Submodules/
eDistantObject/
```
Open the `EarlGrey.xcodeproj` file and ensure that the `AppFramework` and the `TestLib` target
build.
<img src="images/targets.png">
Add the `EarlGrey.xcodeproj` file to your project's Xcode. This is as simple as
a drag and drop inside your Xcode Project. Make sure it is inside your project target
and not outside it (doing the latter will make Xcode ask you to create a workspace).
Ensure that the EarlGrey targets are now present in your list of targets. In case any
of the newly added projects are greyed out, please close any open Xcode Projects
and re-open your test project.
### 1. Creating a UI Test Target
To create a UI test target, go to `File >> New >> Target >> iOS >> UITesting
Bundle`
<img src="images/uiTestingBundle.png">
You should now have a simple plain XCUITest available. In the following steps,
we will integrate EarlGrey 2.0 with it.
### 2. Test Component
1. In the `Build Phases` of your UI test target, add `libTestLib.a` into the
"Link Binary With Libraries" section.
<img src="images/testsTargetBuildPhases.png">
2. In `Build Settings` add `-ObjC` to `Other Linker Flags` to load all the
TestLib symbols in your tests.
<img src="images/otherLinkerFlag.png">
3. Add the `User Header Search Paths` for the EarlGrey directory (**the
directory containing the EarlGrey.xcodeproj**) and the eDistantObject
directory (**the directory containing the eDistantObject.xcodeproj**) so
that all headers can be accessed. Select them as **recursive**.
<img src="images/userHeaderSearchPath.png">
### 3. App Component
The App Component of EarlGrey 2.0 is a framework which allows you to dynamically
inject it into your application. For the dynamic injection, we have to use the
**UI Test Target** to inject it into the Application. So, go to the Build Phases
of your UI Test Target:
* In Build Phases, Click on the (+) sign at the top and select `New Copy Files
Phase`. In the new Copy Files Phase that is added, add the following
information:
* Destination: `Absolute Path`
* Path:
`$(TARGET_BUILD_DIR)/../../<YOUR_APPLICATION_TARGET_NAME.app>/Frameworks`
* Uncheck `Copy only when installing`
* Click on the (+) in the bottom and add AppFramework.framework. Select
`Code Sign On Copy`
<img src="images/appframeworkBuildPhase.png">
Make sure your test target builds fine and that's it! You're ready to write your
first test now!
## 2. Basic EarlGrey 2.0 Test
For EarlGrey 2.0 to work with XCUITest, AppFramework.framework needs to be
dynamically loaded into the application under test. We have added code to do so
within EarlGrey's AppFramework component so you don't need to. If you've
finished the Copy Files Script work above, then the following code should run
fine for you now.
```objective-c
#import <XCTest/XCTest.h>
#import "TestLib/EarlGrey.h"
@interface FirstEarlGreyV2Test : XCTestCase
@end
@implementation FirstEarlGreyV2Test
- (void)testIfKeyWindowIsPresent {
// XCUITest Setup
XCUIApplication *application = [[XCUIApplication alloc] init];
[application launch];
// EarlGrey Statement
[[EarlGrey selectElementWithMatcher:GREYKeyWindow()] performAction:grey_tap()];
}
@end
```
## 3. Swift Support
The setup of the project is exactly the same for Swift tests as it is for an
Objective-C one, down to the `User Header Search Paths`. The only addition that
you need to make is adding the [EarlGrey.swift](../TestLib/Swift/EarlGrey.swift)
wrapper that provides a Swift-only interface for EarlGrey 2.0 to your test
target.
#### Bridging Header
Since EarlGrey 2.0's Test component is a Library, you need to add a Bridging
Header to ensure `EarlGrey.swift` compiles.
Please create a Bridging Header for your Swift Test Target. We found [this doc](https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_objective-c_into_swift)
helpful for this:
<img src="images/swiftBridgingHeader.png">
Add the following imports:
```objective-c
#import "AppFramework/Action/GREYAction.h"
#import "AppFramework/Action/GREYActionBlock.h"
#import "AppFramework/Action/GREYActions.h"
#import "CommonLib/DistantObject/GREYHostApplicationDistantObject.h"
#import "CommonLib/Matcher/GREYElementMatcherBlock.h"
#import "CommonLib/Matcher/GREYMatcher.h"
#import "TestLib/AlertHandling/XCTestCase+GREYSystemAlertHandler.h"
#import "TestLib/EarlGrey.h"
```
If you need any more EarlGrey imports in your Swift tests, *add them in the bridging
header*. This will get rid of any `undeclared type` warnings. For starting off, you
can add [EarlGreySwiftBridgingHeader.h](../TestLib/Swift/EarlGreySwiftBridgingHeader.h)
to your Test Component.
Just add this file to your Test Target. You don't need to import EarlGrey in
your test file. For loading the framework on a device, please add
`@loader_path/Frameworks` to your `Runpath Search Paths` for both the App and
Test Component.
The following code should work just fine now:
```swift
class MyFirstEarlGreyTest: XCTestCase {
func testExample() {
let application: XCUIApplication = XCUIApplication()
application.launch()
EarlGrey.selectElement(with: GREYKeyWindow())
.perform(grey_tap())
}
}
```
### More Details
For more details about the setup, take a look at the EarlGrey 2.0
[FunctionalTests](../Tests/Functional/README.md) Project. To get
started with making open-box calls, take a look at this doc:
* [Open-Boxing Pre-requisites](open-boxing-setup-guide.md)