Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add LambdaTest integration (from #2424) #2447

Merged
merged 16 commits into from
Dec 9, 2024
4 changes: 4 additions & 0 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,10 @@
{
"title": "Browserstack",
"href": "/documentation/integrations/browserstack"
},
{
"title": "LambdaTest",
"href": "/documentation/integrations/lambdatest"
}
]
},
Expand Down
62 changes: 62 additions & 0 deletions docs/documentation/integrations/lambdatest.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: Integrations - LambdaTest
---

# LambdaTest overview

[LambdaTest App Test Automation] is a popular cloud device farm.

<Warning>This integration is currently Android-only.</Warning>

### Change runner

Modify the **app-level build.gradle**:

```groovy title="android/app/build.gradle"
android {
// ...
defaultConfig {
//...
testInstrumentationRunner "pl.leancode.patrol.LambdaTestPatrolJUnitRunner"
}
// ...
}

// ...
```

### Upload to LambdaTest

To run Android UI tests on LambdaTest:

1. Upload the app under test APK to LambdaTest ([see docs][LT_app_docs])
2. Upload the instrumentation app APK to LambdaTest ([see docs][LT_test_docs])
3. Start test execution on LambdaTest ([see docs][LT_execute_docs])

```
$ export LAMBDATEST_PROJECT=AwesomeApp # optional
$ export LAMBDATEST_DEVICES="[\"Pixel 7 Pro-13\"]" # optional
• Building apk with entrypoint test_bundle.dart...
✓ Completed building apk with entrypoint test_bundle.dart (11.0s)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 82.4M 100 255 100 82.4M 7 2897k 0:00:31 0:00:36 0:00:02 2051k
Uploaded app, "app_id": "lt://APP1016047291733313441063634",
Uploaded testsuite, "app_id": "lt://APP1016047291733312896265135",
{
"status": [
"Success"
],
"buildId": [
"5875687"
],
"message": [
""
]
}
```

[LT_app_docs]: https://www.lambdatest.com/support/docs/getting-started-with-flutter-dart-android-automation/#step-2-upload-your-application
[LT_test_docs]: https://www.lambdatest.com/support/docs/getting-started-with-flutter-dart-android-automation/#step-3-uploading-test-suite
[LT_execute_docs]: https://www.lambdatest.com/support/docs/getting-started-with-flutter-dart-android-automation/#step-4-executing-the-test
[LambdaTest App Test Automation]: https://www.lambdatest.com/app-test-automation
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package pl.leancode.patrol;

import android.util.Log;
import pl.leancode.patrol.contracts.PatrolAppServiceClientException;

import java.net.Inet4Address;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.Objects;

public class LambdaTestPatrolJUnitRunner extends PatrolJUnitRunner {
@Override
public PatrolAppServiceClient createAppServiceClient() {
// Create client with a default constructor (localhost:8082) by default.
PatrolAppServiceClient client = new PatrolAppServiceClient();
waitForPatrolAppService();

try {
client.listDartTests();
} catch (PatrolAppServiceClientException ex) {
ex.printStackTrace();
// If the client on localhost:8082 fails, let's apply the wokraround
Logger.INSTANCE.i("PatrolAppServiceClientException in createAppServiceClient " + ex.getMessage());
Logger.INSTANCE.i("LOOPBACK: " + getLoopback());
client = new PatrolAppServiceClient(getLoopback());
}

return client;
}

public String getLoopback() {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface i = interfaces.nextElement();
Log.d("LOOPBACK", i.getDisplayName());
if (Objects.equals(i.getDisplayName(), "tun0")) {
for (java.net.InterfaceAddress a : i.getInterfaceAddresses()) {
if (a.getAddress() instanceof Inet4Address) {
return a.getAddress().toString().substring(1);
}
}
}

}
} catch (SocketException e) {
}

return null;
}
}
Loading