Skip to content

Commit b52f9f6

Browse files
Set up CI with Azure Pipelines (#9)
* Set up CI with Azure Pipelines * Create sonar-project.properties * Corrected capabilities in settings * Add ScreenshotListener and fail a test to check artifacts are stored in pipeline * Add sonar tasks, add log to artifacts, named tasks
1 parent 4f8aa9d commit b52f9f6

File tree

7 files changed

+194
-4
lines changed

7 files changed

+194
-4
lines changed

azure-pipelines.yml

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
# Maven
2+
3+
trigger:
4+
- master
5+
6+
pool:
7+
vmImage: 'macOS 10.14'
8+
9+
variables:
10+
ANDROID_EMU_NAME: test
11+
ANDROID_EMU_ABI: x86
12+
ANDROID_EMU_TARGET: android-28
13+
ANDROID_EMU_TAG: google_apis
14+
XCODE_VERSION: 10.2
15+
IOS_PLATFORM_VERSION: 12.2
16+
IOS_DEVICE_NAME: iPhone X
17+
steps:
18+
19+
- task: SonarCloudPrepare@1
20+
displayName: 'Prepare SonarCloud analysis'
21+
inputs:
22+
SonarCloud: 'SonarCloud'
23+
organization: 'aqualityautomation'
24+
scannerMode: 'CLI'
25+
configMode: 'file'
26+
extraProperties: |
27+
sonar.coverage.exclusions=**/**
28+
29+
- task: Maven@3
30+
displayName: 'Compile project'
31+
inputs:
32+
mavenPomFile: 'pom.xml'
33+
goals: 'clean compile'
34+
publishJUnitResults: true
35+
testResultsFiles: '**/surefire-reports/TEST-*.xml'
36+
javaHomeOption: 'JDKVersion'
37+
mavenVersionOption: 'Default'
38+
mavenAuthenticateFeed: false
39+
effectivePomSkip: false
40+
sonarQubeRunAnalysis: false
41+
continueOnError: true
42+
43+
- task: SonarCloudAnalyze@1
44+
displayName: 'Run SonarCloud code analysis'
45+
continueOnError: true
46+
47+
- task: SonarCloudPublish@1
48+
displayName: 'Publish SonarCloud quality gate results'
49+
continueOnError: true
50+
51+
- task: NodeTool@0
52+
displayName: 'Install Node.js tool to setup Appium and emulators'
53+
inputs:
54+
versionSpec: '11.15.0'
55+
56+
- script: |
57+
echo "Configuring Environment"
58+
echo $JAVA_HOME
59+
ls /Library/Java/JavaVirtualMachines/
60+
61+
ls $ANDROID_HOME/build-tools/
62+
export PATH=$PATH:$JAVA_HOME/bin
63+
64+
echo export "ANDROID_HOME=\$ANDROID_HOME" >> ~/.bash_profile
65+
export PATH=$PATH:$ANDROID_HOME
66+
67+
mvn -version
68+
echo $ANDROID_HOME
69+
echo $JAVA_HOME
70+
echo $PATH
71+
72+
echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install 'system-images;$(ANDROID_EMU_TARGET);$(ANDROID_EMU_TAG);$(ANDROID_EMU_ABI)'
73+
echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n "$(ANDROID_EMU_NAME)" -k 'system-images;$(ANDROID_EMU_TARGET);$(ANDROID_EMU_TAG);$(ANDROID_EMU_ABI)' --force
74+
echo $ANDROID_HOME/emulator/emulator -list-avds
75+
76+
echo "Starting emulator"
77+
nohup $ANDROID_HOME/emulator/emulator -avd "$(ANDROID_EMU_NAME)" -no-snapshot > /dev/null 2>&1 &
78+
$ANDROID_HOME/platform-tools/adb wait-for-device
79+
while [[ $? -ne 0 ]]; do sleep 1; $ANDROID_HOME/platform-tools/adb shell pm list packages; done;
80+
$ANDROID_HOME/platform-tools/adb devices
81+
echo "Emulator started"
82+
83+
84+
echo "Installing Appium"
85+
node --version
86+
87+
npm list --depth 0
88+
npm install -g [email protected]
89+
# --chromedriver-skip-install
90+
ln -fs /usr/local/lib/node_modules/appium/build/lib/main.js /usr/local/bin/appium
91+
chmod +x /usr/local/bin/appium
92+
export PATH=$PATH:/usr/local/bin/appium
93+
94+
echo "Installing and Running Appium doctor"
95+
npm install -g appium-doctor
96+
ln -fs /usr/local/lib/node_modules/appium-doctor/appium-doctor.js /usr/local/bin/appium-doctor
97+
chmod +x /usr/local/bin/appium-doctor
98+
export PATH=$PATH:/usr/local/bin/appium-doctor
99+
100+
npm list --depth 0
101+
102+
appium --version
103+
appium-doctor
104+
105+
#sudo xcode-select -s /Applications/Xcode_$(XCODE_VERSION).app/Contents/Developer
106+
#xcrun simctl list
107+
108+
appium --allow-insecure chromedriver_autodownload &
109+
echo "Appium server started"
110+
111+
- task: Maven@3
112+
displayName: 'Run tests'
113+
inputs:
114+
mavenPomFile: 'pom.xml'
115+
goals: 'test'
116+
publishJUnitResults: true
117+
testResultsFiles: '**/surefire-reports/TEST-*.xml'
118+
javaHomeOption: 'JDKVersion'
119+
mavenVersionOption: 'Default'
120+
mavenAuthenticateFeed: false
121+
effectivePomSkip: false
122+
sonarQubeRunAnalysis: false
123+
continueOnError: true
124+
125+
- task: CopyFiles@2
126+
displayName: 'Copy failure screenshots and test logs'
127+
inputs:
128+
SourceFolder: '$(Build.SourcesDirectory)/target'
129+
Contents: |
130+
surefire-reports/failure_screenshots/*.png
131+
log/*.log
132+
TargetFolder: '$(Build.ArtifactStagingDirectory)'
133+
134+
- task: PublishBuildArtifacts@1
135+
displayName: 'Publish copied artifacts'
136+
inputs:
137+
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
138+
ArtifactName: 'drop'
139+
publishLocation: 'Container'

sonar-project.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
sonar.sources=src/main
2+
sonar.tests=src/test
3+
sonar.language=java
4+
sonar.java.binaries=.
5+
sonar.sourceEncoding=UTF-8
6+
sonar.projectKey=aquality-automation_aquality-appium-mobile-java

src/test/java/samples/android/AndroidBasicInteractionsTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
import org.testng.Assert;
66
import org.testng.annotations.AfterClass;
77
import org.testng.annotations.BeforeClass;
8+
import org.testng.annotations.Listeners;
89
import org.testng.annotations.Test;
910
import samples.android.apidemos.screens.AlertsMenuScreen;
1011
import samples.android.apidemos.screens.InvokeSearchScreen;
1112
import samples.android.apidemos.screens.MainMenuScreen;
1213
import samples.android.apidemos.screens.TwoButtonsAlert;
14+
import testreport.ScreenshotListener;
1315

16+
@Listeners(ScreenshotListener.class)
1417
public class AndroidBasicInteractionsTest {
1518

1619
@BeforeClass

src/test/java/samples/android/AndroidCreateWebSessionTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package samples.android;
22

3-
43
import aquality.appium.mobile.application.AqualityServices;
54
import aquality.appium.mobile.application.MobileModule;
65
import aquality.appium.mobile.elements.interfaces.ITextBox;
@@ -11,11 +10,14 @@
1110
import org.testng.Assert;
1211
import org.testng.annotations.AfterClass;
1312
import org.testng.annotations.BeforeClass;
13+
import org.testng.annotations.Listeners;
1414
import org.testng.annotations.Test;
15+
import testreport.ScreenshotListener;
1516

1617
import java.net.URI;
1718
import java.net.URISyntaxException;
1819

20+
@Listeners(ScreenshotListener.class)
1921
public class AndroidCreateWebSessionTest {
2022
private AndroidDriver<WebElement> driver;
2123

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package testreport;
2+
3+
import aquality.appium.mobile.application.AqualityServices;
4+
import org.apache.commons.io.FileUtils;
5+
import org.openqa.selenium.OutputType;
6+
import org.openqa.selenium.TakesScreenshot;
7+
import org.testng.ITestResult;
8+
import org.testng.Reporter;
9+
import org.testng.TestListenerAdapter;
10+
11+
import java.io.File;
12+
import java.io.IOException;
13+
import java.text.SimpleDateFormat;
14+
import java.util.Calendar;
15+
16+
public class ScreenshotListener extends TestListenerAdapter {
17+
@Override
18+
public void onTestFailure(ITestResult result) {
19+
Calendar calendar = Calendar.getInstance();
20+
SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");
21+
String dateString = formater.format(calendar.getTime());
22+
String methodName = result.getName();
23+
if(!result.isSuccess() && AqualityServices.isApplicationStarted()){
24+
File scrFile = ((TakesScreenshot)AqualityServices.getApplication().getDriver()).getScreenshotAs(OutputType.FILE);
25+
try {
26+
String reportDirectory = String.format("%s/target/surefire-reports", new File(System.getProperty("user.dir")).getAbsolutePath());
27+
File destFile = new File(String.format("%s/failure_screenshots/%s_%s.png", reportDirectory, methodName, dateString));
28+
FileUtils.copyFile(scrFile, destFile);
29+
Reporter.log(String.format("<a href='%s'> <img src='%s' height='100' width='100'/> </a>", destFile.getAbsolutePath(), destFile.getAbsolutePath()));
30+
} catch (IOException e) {
31+
AqualityServices.getLogger().fatal("An IO exception occured while tried to save a screenshot", e);
32+
}
33+
}
34+
}
35+
}

src/test/resources/settings.androidwebsession.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
"driverSettings": {
88
"android": {
99
"capabilities": {
10-
"deviceName": "Android Emulator",
11-
"browserName": "Chrome"
10+
"deviceName": "test",
11+
"browserName": "Chrome",
12+
"uiautomator2ServerInstallTimeout": 30000,
13+
"eventTimings": true
1214
}
1315
}
1416
},

src/test/resources/settings.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
"android": {
99
"applicationPath": "./src/test/resources/apps/ApiDemos-debug.apk",
1010
"capabilities": {
11-
"deviceName": "Android Emulator"
11+
"deviceName": "Android Emulator",
12+
"automationName": "UIAutomator2",
13+
"eventTimings": true,
14+
"uiautomator2ServerInstallTimeout": 30000
1215
}
1316
},
1417
"ios": {

0 commit comments

Comments
 (0)