paint-brush
কিভাবে প্রতিদিন মোবাইল ডিভাইসে 5000+ পরীক্ষা চালাবেন; ইনড্রাইভের প্লেবুক থেকে (পর্ব 1)দ্বারা@indrivetech
18,878 পড়া
18,878 পড়া

কিভাবে প্রতিদিন মোবাইল ডিভাইসে 5000+ পরীক্ষা চালাবেন; ইনড্রাইভের প্লেবুক থেকে (পর্ব 1)

দ্বারা inDrive.Tech10m2023/05/30
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

InDrive iOS এবং Android ডিভাইসে একত্রে প্রতিদিন 5,000 টিরও বেশি পরীক্ষা চালায়। রহস্যটি সহজ: আমরা সেলেনয়েড ব্যবহার করেছি। অ্যাপিয়াম পরীক্ষা লিখতে, আমরা ব্যবহার করি: কোটলিন; জুনিট 5; মাভেন। আমরা উপাদানটিকে দুটি অংশে ভাগ করা একটি ভাল ধারণা বলে মনে করেছি: প্রথমটি অ্যান্ড্রয়েডে ফোকাস করে এবং দ্বিতীয়টি iOS-এ৷
featured image - কিভাবে প্রতিদিন মোবাইল ডিভাইসে 5000+ পরীক্ষা চালাবেন; ইনড্রাইভের প্লেবুক থেকে (পর্ব 1)
inDrive.Tech HackerNoon profile picture

হাই সব! আমার নাম তারাস এগোরভ; আমি ইনড্রাইভে একজন প্রকৌশলী। আমি আপনাকে দেখাব কিভাবে আমরা iOS এবং Android ডিভাইসে প্রতিদিন 5,000 টিরও বেশি পরীক্ষা চালানোর জন্য সক্ষম একটি পরিকাঠামো সেট আপ করি। রহস্যটি সহজ: আমরা সেলেনয়েড ব্যবহার করেছি।

মুখবন্ধ

গত বছর, আমাদের সহকর্মীরা স্বয়ংক্রিয় পরীক্ষার একটি অধ্যয়ন পরিচালনা করেছিল এবং আমরা অধ্যয়নের অংশ হিসাবে একটি সমীক্ষায় অংশ নিয়েছিলাম।

জরিপকৃতদের মধ্যে, অ্যাপিয়াম প্রায় 20 শতাংশ দল ব্যবহার করেছিল, যা একটি খারাপ শুরু নয়।


আমরা সমীক্ষার ফলাফলে সন্তুষ্ট ছিলাম, তাই আমরা আপনার সাথে আমাদের অভিজ্ঞতা শেয়ার করার জন্য এবং বিনিময়ে কিছু পরামর্শ পেতে একটি নিবন্ধ লেখার সিদ্ধান্ত নিয়েছি। আমরা উপাদানটিকে দুটি ভাগে ভাগ করা একটি ভাল ধারণা বলে মনে করেছি: প্রথমটি Android এবং দ্বিতীয়টি iOS-এ ফোকাস করে৷


আসুন Android দিয়ে শুরু করি।

অ্যান্ড্রয়েডে পরীক্ষা চলছে

সেলেনয়েড একটি ডকার কন্টেইনারে ব্রাউজার এবং অ্যান্ড্রয়েড এমুলেটর চালানো এবং পরিচালনা করার জন্য একটি জনপ্রিয় টুল। আপনি ডকুমেন্টেশনে এই সম্পর্কে আরও পড়তে পারেন।


অ্যাপিয়াম পরীক্ষা লিখতে, আমরা ব্যবহার করি:

  • কোটলিন;
  • জুনিট 5;
  • মাভেন।

প্রথম রান। সেলেনয়েড সেট আপ করা হচ্ছে

  1. একটি browsers.json কনফিগারেশন ফাইল তৈরি করুন:


 {  "android": {    "default": "10.0",    "versions": {      "10.0": {        "image": "browsers/android:10.0",        "port": "4444",        "path": "/wd/hub"      }    }  } }


এমুলেটর ইমেজ image নির্দিষ্ট করা হয়. অ্যারোকুবের ছেলেরা অ্যান্ড্রয়েড এমুলেটরগুলির রেডিমেড ছবি তৈরি করেছে। আপনি এখানে বা এখানে তাদের চেক আউট করতে পারেন. ছবিগুলো একে অপরের থেকে কোনোভাবেই আলাদা নয়।


একটি উদাহরণ হিসাবে চিত্র browsers/android:10.0 নেওয়া যাক। ছবিটি অবশ্যই আগে থেকে ডাউনলোড করতে হবে: docker pull browsers/android:10.0 , অন্যথায় পরীক্ষাগুলি চালানো হবে না:


 Original error: create container: Error response from daemon: No such image: browsers/android:10.0


  1. পরবর্তী ধাপ হল সেলেনয়েড চালানো। আমরা এটি সরাসরি ডকারের মাধ্যমে করি, অথবা কনফিগারেশন ম্যানেজার ব্যবহার করার বিকল্প রয়েছে।


 docker run -d \           -v /var/run/docker.sock:/var/run/docker.sock \           -v "$(pwd)/selenoid/config/":/etc/selenoid/:ro \           -p 4444:4444 \           --name selenoid \           aerokube/selenoid:1.10.7


আপনি আপনার ব্রাউজারে http://localhost:4444 লিঙ্কটি অনুসরণ করে Selenoid সঠিকভাবে কাজ করছে কিনা তা দেখতে পারেন:


 You are using Selenoid 1.10.7!


  1. ড্রাইভারের অ্যাপিয়াম পরীক্ষায় সেলেনয়েড ঠিকানা উল্লেখ করুন:


 ... val driver = AndroidDriver(URL("http://localhost:4444/wd/hub"), capabilities) ...


  1. এর পরে, বিল্ড ইন ক্ষমতার লিঙ্কটি নির্দিষ্ট করুন:


 ... capabilities.setCapability("appium:app", "https://storage.example.com/builds/app.apk") ...


একটি লিঙ্ক প্রদান করতে অক্ষম হলে, আপনি বিল্ডের পথ নির্দিষ্ট করতে পারেন:**


 ... capabilities.setCapability("appium:app", "/builds/app.apk") ...


যেখানে /builds/app.apk হল কন্টেইনারের ভিতরের পাথ যেখানে এমুলেটর চালানো হচ্ছে। এই বিকল্পটি সঠিকভাবে কাজ করার জন্য, browsers.jsonvolumes নির্দিষ্ট করতে ভুলবেন না:


 {  "android": {    "default": "10.0",    "versions": {      "10.0": {        ...        "volumes": [          "/home/username/app.apk:/builds/app.apk:ro"        ]        ...      }    }  } }


যেখানে /home/username/app.apk হোস্ট প্ল্যাটফর্মে বিল্ড করার পথ।


এটাই, আমরা প্রায় সেলেনয়েড সেট আপ করেছি, এবং এখন আমরা পরীক্ষা চালানোর চেষ্টা করতে পারি:


 ./mvnw test


কিন্তু, দুর্ভাগ্যবশত, পরীক্ষা চালাতে সক্ষম হবে না। এর এই দিকে তাকান এবং দেখুন কি ভুল.

দ্বিতীয় রান। লগ এবং ভিডিও কটাক্ষপাত গ্রহণ

একটি ব্যর্থ স্টার্টআপের পরে প্রথম কাজটি হল সেলেনয়েড লগগুলি পরীক্ষা করা:


 docker logs selenoid


 [INIT] [Loading configuration files...] [INIT] [Loaded configuration from /etc/selenoid/browsers.json] [INIT] [Video Dir: /opt/selenoid/video] [INIT] [Your Docker API version is 1.41] [INIT] [Timezone: UTC] [INIT] [Listening on :4444] [NEW_REQUEST] [unknown] [172.17.0.1] [NEW_REQUEST_ACCEPTED] [unknown] [172.17.0.1] [LOCATING_SERVICE] [android] [10.0] [USING_DOCKER] [android] [10.0] [CREATING_CONTAINER] [selenoid/android:10.0] [STARTING_CONTAINER] [selenoid/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [CONTAINER_STARTED] [selenoid/android:10.0] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0.40s] [0] [REMOVING_CONTAINER] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [CONTAINER_REMOVED] [75e454341da7fc4b58ba104a5180813bac6cd7c124037a759b6c976e65b168fa] [0] [SERVICE_STARTUP_FAILED] [http://172.17.0.3:4444/wd/hub does not respond in 30s]


আমরা দেখি যে স্ট্যাটাসটি SERVICE_STARTUP_FAILED। ডকুমেন্টেশনে যান এবং স্থিতি মান দেখুন:


 SERVICE_STARTUP_FAILED - Failed to start Docker container or driver binary


ত্রুটি আপনাকে অনেক কিছু বলে না, এবং আরও তথ্যের প্রয়োজন৷ কন্টেইনার লগগুলি একবার দেখে নেওয়া ভাল হবে। আসুন লগিং সক্ষম করে এটি করি:


 docker run -d \           -p 4444:4444 \           -v /var/run/docker.sock:/var/run/docker.sock \           -v "$(pwd)/selenoid/config/":/etc/selenoid/:ro \           -v "$(pwd)/selenoid/logs/":/opt/selenoid/logs/ \           aerokube/selenoid:1.10.7 \           -log-output-dir /opt/selenoid/logs


এছাড়াও আমরা সক্ষমতা বিভাগে লগ সক্ষম করি:


 ... capabilities.setCapability("enableLog", true) ...


পরীক্ষা চালান এবং ব্রাউজার ব্যবহার করে লগ পর্যালোচনা করুন http://localhost:4444/logs/ :


 2023-04-16T13:44:43.909768530Z Waiting X server... 2023-04-16T13:44:44.009494775Z Logging to: /tmp/fluxbox.log 2023-04-16T13:44:44.047587277Z Waiting X server... 2023-04-16T13:44:44.151933325Z Waiting X server... 2023-04-16T13:44:44.262850410Z * daemon not running; starting now at tcp:5037 2023-04-16T13:44:44.457972956Z * daemon started successfully 2023-04-16T13:44:44.458249266Z adb: no devices/emulators found 2023-04-16T13:44:45.463480812Z adb: no devices/emulators found 2023-04-16T13:44:46.471547723Z adb: no devices/emulators found 2023-04-16T13:44:47.476093515Z adb: no devices/emulators found 2023-04-16T13:44:48.481987351Z adb: no devices/emulators found 2023-04-16T13:44:49.486503149Z adb: no devices/emulators found 2023-04-16T13:44:50.492757801Z adb: no devices/emulators found 2023-04-16T13:44:51.499094108Z adb: no devices/emulators found 2023-04-16T13:44:52.505862428Z adb: no devices/emulators found 2023-04-16T13:44:53.513276412Z adb: no devices/emulators found 2023-04-16T13:44:54.520642210Z adb: no devices/emulators found 2023-04-16T13:44:55.527420189Z adb: no devices/emulators found 2023-04-16T13:44:56.534631013Z adb: no devices/emulators found 2023-04-16T13:44:57.316094939Z WARNING. Using fallback path for the emulator registration directory. 2023-04-16T13:44:57.335415397Z checkValid: hw configs not eq 2023-04-16T13:44:57.541959741Z adb: device offline 2023-04-16T13:44:58.547907700Z adb: device offline 2023-04-16T13:44:58.565504866Z emulator: WARNING: System image is writable 2023-04-16T13:44:58.565528396Z emulator: Cold boot: different AVD configuration 2023-04-16T13:44:58.565532576Z Your emulator is out of date, please update by launching Android Studio: 2023-04-16T13:44:58.565536346Z - Start Android Studio 2023-04-16T13:44:58.565539506Z - Select menu "Tools > Android > SDK Manager" 2023-04-16T13:44:58.565543076Z - Click "SDK Tools" tab 2023-04-16T13:44:58.565546216Z - Check "Android Emulator" checkbox 2023-04-16T13:44:58.565549216Z - Click "OK" 2023-04-16T13:44:58.565552146Z 2023-04-16T13:44:59.554451514Z adb: device offline 2023-04-16T13:45:00.560926060Z adb: device offline 2023-04-16T13:45:01.568777440Z adb: device offline 2023-04-16T13:45:12.124226047Z emulator: INFO: boot completed 2023-04-16T13:45:12.124251007Z emulator: INFO: boot time 27848 ms 2023-04-16T13:45:12.124255077Z emulator: Increasing screen off timeout, logcat buffer size to 2M. 2023-04-16T13:45:12.152557294Z emulator: Revoking microphone permissions for Google App.


কন্টেইনার লগগুলি এখানে খুব বেশি সাহায্য করে না, কারণ আপনি অ্যাপিয়াম লগগুলি দেখতে পাচ্ছেন না। এখন তাদের সক্রিয় করার চেষ্টা করা যাক. এটি করার জন্য, আসুন স্ক্রিপ্ট এন্ট্রি point.sh দেখুন:


 ... if [ -z "$VERBOSE" ]; then APPIUM_ARGS="$APPIUM_ARGS --log-level error" else EMULATOR_ARGS="$EMULATOR_ARGS -verbose" fi ...


অ্যাপিয়াম লগ সক্রিয় করতে, প্যারামিটার VERBOSE=true এবং APPIUM_ARGS=--log-level debug : কন্টেইনারে পাস করতে হবে:


 {  "android": {    "default": "10.0",    "versions": {      "10.0": {        ...        "env": [          "VERBOSE=true",          "APPIUM_ARGS=--log-level debug"        ]        ...      }    }  } }


লগ ডিবাগ করতে Appium সক্ষম করতে, আপনাকে VERBOSE পাস করতে হবে; এই ক্ষেত্রে, এমুলেটর লগগুলি চালু হয় এবং "ইথার"" পূরণ করা শুরু করে তবে আমরা ভবিষ্যতের চিত্রগুলির জন্য এটি ঠিক করেছি =)


এখন এটি APPIUM_ARGS=-log-level debug পাস করার জন্য যথেষ্ট।


 ... [HTTP] --> POST /wd/hub/session/c89fa9c2-ca2b-49cd-ab31-590eeccf77d1/element [HTTP] {"using":"id","value":"authorization_edittext_phone"} [debug] [W3C (c89fa9c2)] Calling AppiumDriver.findElement() with args: ["id","authorization_edittext_phone"," c89fa9c2-ca2b-49cd-ab31-590eeccf77d1"] [debug] [BaseDriver] Valid locator strategies for this request: xpath, id, class name, accessibility id, -and roid uiautomator [debug] [BaseDriver] Waiting up to 0 ms for condition [debug] [WD Proxy] Matched '/element' to command name 'findElement' [debug] [WD Proxy] Proxying [POST /element] to [POST http://127.0.0.1:8200/wd/hub/session/65943f03-3b35-4d3eb221-d6dc7988f935/element] with body: {"strategy":"id","selector": "authorization_edittext_phone","context":"","multiple":false} [WD Proxy] Got response with status 404: {"sessionId":"65943f03-3b35-4d3e-b221-d6dc7988f935","value":{"error" :"no such element","message":"An element could not be located on the page using the given search parameters","stacktrace":"io.appium.uiautomator2.common.exceptions.El ementNotFoundException: An element could not be located on the page using the given search parameters\n\tat io.appium.uiautomator2.handler.FindElement.safeHandle(Find Element.java:73)\n\tat io.appium.uiautomator2.handler.request.SafeRequestHandler.handle(SafeRequestHandler.java:41)\n\tat io.appium.uiautomator2.server.AppiumServlet. handleRequest(AppiumServlet.java:253)\n\tat io.appium.uiautomator2.server.AppiumServlet.handleHttpRequest(AppiumServlet.java:247)\n\tat io.appium.uiautomator2.http.Se rverHandler.channelRead(ServerHandler.java:68)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)\n\tat io .netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)\n\tat io.netty.chann... [debug] [W3C] Matched W3C error code 'no such element' to NoSuchElementError [debug] [W3C (c89fa9c2)] Encountered internal error running command: NoSuchElementError: An element could not be located on the page using the given search parameters. [debug] [W3C (c89fa9c2)] at AndroidUiautomator2Driver.findElOrEls (/opt/node_modules/appium/node_modules/appium-android-driver/lib/commands/find.js:75:11) [debug] [W3C (c89fa9c2)] at process._tickCallback (internal/process/next_tick.js:68:7) [HTTP] <-- POST /wd/hub/session/c89fa9c2-ca2b-49cd-ab31-590eeccf77d1/element 404 23 ms - 444 ...


লগ থেকে দেখা যায়, অ্যাপিয়াম আমাদের উপাদান খুঁজে পায় না। এমুলেটর স্ক্রিনে কী ঘটছে তা দেখা যাক। এটি করার জন্য, আমাদের Selenoid UI চালাতে হবে:


 docker run -d \           --name selenoid-ui \           -p 8080:8080 \           --link selenoid:selenoid \           aerokube/selenoid-ui:1.10.4 \           --selenoid-uri "http://selenoid:4444"


http://0.0.0.0:8080 এ যান এবং Selenoid UI খুলুন:


সেলেনয়েড UI দেখতে এইরকম


পরীক্ষায় VNC এবং ভিডিও রেকর্ডিং সক্ষম করতে ভুলবেন না:


 ... capabilities.setCapability("enableVNC", true) capabilities.setCapability("enableVideo", true) ...


সেলেনয়েড স্টার্টআপ কমান্ডটি এভাবে দেখায়:


 docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "(pwd)/selenoid/logs/":/opt/selenoid/logs/ \ -v /opt/selenoid/video/:/opt/selenoid/video/ \ -e OVERRIDE_VIDEO_OUTPUT_DIR="/opt/selenoid/video/" \ -p 4444:4444 \ -name selenoid \ aerokube/selenoid:1.10.7 \ -log-output-dir /opt/selenoid/logs


পরীক্ষা শেষ হয়ে গেলে সেলেনয়েড UI খুলুন:


সেলেনয়েড UI-তে স্টার্টআপ প্রক্রিয়াটি দেখতে এইরকম


VNC এবং লগ


এবং এখানে এটির একটি ভিডিও রয়েছে।

আমরা স্টার্টআপ ত্রুটির কারণ খুঁজে পেয়েছি. দারুণ! চল এগোই.

তৃতীয় রান। একটি এমুলেটর ইমেজ নির্মাণ

এটি দেখা যাচ্ছে, সেলেনয়েড এমুলেটরগুলির চিত্রগুলি গুগল প্লে পরিষেবা ছাড়া কাজ করবে না। এই পরিস্থিতির প্রতিকার করার জন্য, আপনাকে অবশ্যই একটি এমুলেটর ইমেজ তৈরি করতে হবে। এরোকুবের ছেলেরা এর জন্য আপনার প্রয়োজনীয় সমস্ত কিছু একত্রিত করেছে: ফটো এবং ডকুমেন্টেশন সহ একটি সংগ্রহস্থল


  1. সংগ্রহস্থল ডাউনলোড করা হচ্ছে
  2. selenium ফোল্ডারে যান।
  3. ./automate_android.sh স্ক্রিপ্টটি চালান এবং প্রশ্নের উত্তর দিন। এটি আমাদের ক্ষেত্রে এটির মতো দেখাচ্ছে:


 Specify Appium version: [1.18.1] >> 1.18.1 Specify Android image type (possible values: "default", "google_apis", "google_apis_playstore", "android-tv", "android-wear"): [default] >> google_apis Specify Application Binary Interface (possible values: "armeabi-v7a", "arm64-v8a", "x86", "x86_64"): [x86] >> x86 Specify Android version: [8.1] >> 10.0 Specify device preset name if needed (eg "Nexus 4"): >> Specify SD card size, Mb: [500] >> Specify userdata.img size, Mb: [500] >> Are you building a Chrome Mobile image (for mobile web testing): [n] >> y Specify Chromedriver version if needed (required for Chrome Mobile): >> 74.0.3729.6 Specify image tag: [selenoid/chrome-mobile:74.0] >> android-emulator:10.0 Add Android quick boot snapshot? [y] >> n


যখন আমি অ্যান্ড্রয়েড দ্রুত বুট স্ন্যাপশট যোগ করুন প্রশ্নটি দেখেছিলাম, তখন আমি ভেবেছিলাম এটি একটি এমুলেটর স্ন্যাপশট । কিন্তু আপনি যদি কোডটি দেখেন তবে এটি একটি স্ক্রিপ্ট কল করে, যা APK অ্যাপ্লিকেশনগুলি ইনস্টল করার জন্য প্রয়োজন। মূলত, এটি আমাদের কোন লাভ দেয় না।


আমরা ইতিমধ্যেই কন্টেইনার লঞ্চের গতি বাড়ানোর জন্য স্ন্যাপশট এমুলেটর ব্যবহার করি, তবে আমরা অন্যান্য নিবন্ধে এটি সম্পর্কে কথা বলব।


  1. একবার ইমেজটি তৈরি হয়ে গেলে, আমাদের এটিকে রেজিস্ট্রিতে পুশ করার জন্য অনুরোধ করা হবে। যেহেতু আমাদের এখনও এটির প্রয়োজন নেই, তাই আমরা দয়া করে অফারটি প্রত্যাখ্যান করব:


 Push? >> n


আমরা Google Play পরিষেবাগুলির সাথে একটি বিল্ড তৈরি করেছি৷ browsers.json-এ ইমেজ প্যারামিটার পরিবর্তন করতে ভুলবেন না এবং Selenoid রিস্টার্ট করুন।


এখন পরীক্ষাগুলি পুনরায় চালানোর চেষ্টা করা যাক:


 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------


এবং এখানে পরীক্ষা চালানোর একটি ভিডিও আছে .

সারসংক্ষেপ

আমরা যা করেছি:


  • Android পরীক্ষা চালানোর জন্য Selenoid কনফিগার করা হয়েছে।
  • সমস্যা সমাধানের জন্য লগ এবং ভিডিওগুলি কীভাবে পরীক্ষা করতে হয় তা শিখেছি৷
  • Google Play পরিষেবাগুলির সাথে আমাদের নিজস্ব এমুলেটর চিত্র তৈরি করেছি৷


অন্য কিছু সম্পর্কে আমি আপনাকে বলতে চাই:


  • সেলেনয়েড টাইমআউট আপনার অ্যাপটি বড় হলে, আপনি টাইমআউট নিয়ে সমস্যায় পড়তে পারেন।
  • কিভাবে আমরা কন্টেইনার দ্রুত চালানোর চেষ্টা করেছি। ভিডিওটি দেখায় যে দৌড়ে প্রায় এক মিনিট বা তার বেশি সময় লাগে।
  • আমরা কীভাবে সেলেনয়েডে এসপ্রেসোতে লেখা নেটিভ অ্যান্ড্রয়েড পরীক্ষা চালানোর চেষ্টা করেছি। স্পয়লার সতর্কতা: এটি কাজ করে!


এদিকে, পরবর্তী অংশে, আমরা আপনাকে বলব যে আমরা কীভাবে পরিকাঠামো বাড়ালাম এবং iOS-এ পরীক্ষা চালিয়েছি।