গেমিং অ্যাপগুলো বিভিন্ন UI ফ্রেমওয়ার্কের উপর তৈরি হলে গেম টেস্টিং স্বয়ংক্রিয় করা কঠিন হতে পারে। গেম লুপ টেস্ট আপনাকে আপনার নেটিভ টেস্টগুলোকে Test Lab সাথে একীভূত করতে এবং আপনার নির্বাচিত ডিভাইসগুলোতে সহজেই সেগুলো চালাতে সাহায্য করে। এই নির্দেশিকায় বর্ণনা করা হয়েছে কীভাবে Firebase Test Lab ব্যবহার করে চালানোর জন্য একটি গেম লুপ টেস্ট প্রস্তুত করতে হয়।
গেম লুপ পরীক্ষা সম্পর্কে
গেম লুপ টেস্ট বলতে কী বোঝায়?
একটি গেম লুপ টেস্ট একজন আসল খেলোয়াড়ের কার্যকলাপকে অনুকরণ করে, যা যাচাই করে যে আপনার গেমটি ব্যবহারকারীদের জন্য দ্রুত এবং পরিবর্ধনযোগ্য উপায়ে ভালোভাবে কাজ করছে কিনা। একটি লুপ হলো আপনার গেমিং অ্যাপে টেস্টটির একটি সম্পূর্ণ বা আংশিক চালনা। আপনি একটি গেম লুপ টেস্ট স্থানীয়ভাবে একটি সিমুলেটরে অথবা Test Lab একাধিক ডিভাইসে চালাতে পারেন। গেম লুপ টেস্ট নিম্নলিখিত কাজে ব্যবহার করা যেতে পারে:
- একজন সাধারণ ব্যবহারকারী যেভাবে খেলবে, সেভাবে আপনার গেমটি তৈরি করুন। আপনি ব্যবহারকারীর ইনপুট স্ক্রিপ্ট করতে পারেন, ব্যবহারকারীকে নিষ্ক্রিয় রাখতে পারেন, অথবা ব্যবহারকারীর পরিবর্তে একটি এআই (AI) ব্যবহার করতে পারেন (উদাহরণস্বরূপ, যদি আপনি একটি গাড়ি রেসিং গেমে এআই প্রয়োগ করেন, তবে ব্যবহারকারীর ইনপুটের দায়িত্বে একজন এআই ড্রাইভারকে রাখতে পারেন)।
- আপনার গেমটি সর্বোচ্চ কোয়ালিটি সেটিংসে চালান, তাহলেই জানতে পারবেন কোন কোন ডিভাইসে এটি সাপোর্ট করবে।
- একটি প্রযুক্তিগত পরীক্ষা চালান, যেমন একাধিক শেডার কম্পাইল করে, সেগুলো এক্সিকিউট করে এবং আউটপুট প্রত্যাশিত কিনা তা যাচাই করুন।
ধাপ ১ : Test Lab কাস্টম ইউআরএল স্কিম নিবন্ধন করুন।
Xcode-এ একটি প্রজেক্ট টার্গেট নির্বাচন করুন।
ইনফো ট্যাবে ক্লিক করুন, তারপর একটি নতুন ইউআরএল টাইপ যোগ করুন।
URL Schemes ফিল্ডে
firebase-game-loopলিখুন। এছাড়াও, আপনি আপনার প্রোজেক্টেরInfo.plistকনফিগারেশন ফাইলে<dict>ট্যাগের মধ্যে যেকোনো জায়গায় কাস্টম URL স্কিমটি যোগ করে রেজিস্টার করতে পারেন:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string></string> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>firebase-game-loop</string> </array> </dict> </array>
আপনার অ্যাপটি এখন Test Lab ব্যবহার করে পরীক্ষা চালানোর জন্য কনফিগার করা হয়েছে।
ধাপ ২ : ঐচ্ছিকভাবে আপনার অ্যাপটি কনফিগার করুন
একাধিক লুপ চালান
আপনি যদি আপনার টেস্টে একাধিক লুপ (যাকে সিনারিও-ও বলা হয়) চালাতে চান, তাহলে অ্যাপটি চালু করার সময় আপনাকে অবশ্যই নির্দিষ্ট করে দিতে হবে যে আপনি কোন লুপগুলো চালাতে চান।
আপনার অ্যাপ ডেলিগেটে, application(_:open:options:) মেথডটি ওভাররাইড করুন:
সুইফট
func application(_app: UIApplication,
open url: URL
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let components = URLComponents(url: url, resolvingAgainstBaseURL: true)!
if components.scheme == "firebase-game-loop" {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
return true
}
উদ্দেশ্য-সি
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary <UIApplicationOpenURLOptionsKey, id> *)options {
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// ...Enter Game Loop Test logic to override application(_:open:options:).
}
}
আপনার টেস্টে যখন আপনি একাধিক লুপ চালান, তখন বর্তমান লুপটি অ্যাপটি চালু করতে ব্যবহৃত URL-এর একটি প্যারামিটার হিসেবে পাস করা হয়। এছাড়াও, কাস্টম URL স্কিমটি ফেচ করতে ব্যবহৃত URLComponents অবজেক্টটি পার্স করে আপনি বর্তমান লুপ নম্বরটি পেতে পারেন:
সুইফট
if components.scheme == "firebase-game-loop" {
// Iterate over all parameters and find the one with the key "scenario".
let scenarioNum = Int(components.queryItems!.first(where: { $0.name == "scenario" })!.value!)!
// ...Write logic specific to the current loop (scenarioNum).
}
উদ্দেশ্য-সি
if ([url.scheme isEqualToString:(@"firebase-game-loop")]) {
// Launch the app as part of a game loop.
NSURLComponents *components = [NSURLComponents componentsWithURL:url
resolvingAgainstBaseURL:YES];
for (NSURLQueryItem *item in [components queryItems]) {
if ([item.name isEqualToString:@"scenario"]) {
NSInteger scenarioNum = [item.value integerValue];
// ...Write logic specific to the current loop (scenarioNum).
}
}
}
একটি পরীক্ষা তাড়াতাড়ি শেষ করুন
ডিফল্টরূপে, একটি গেম লুপ টেস্ট পাঁচ মিনিটের টাইমআউটে না পৌঁছানো পর্যন্ত চলতে থাকে, এমনকি যখন সমস্ত লুপ এক্সিকিউট হয়ে যায় তখনও। টাইমআউট শেষ হলে, টেস্টটি শেষ হয়ে যায় এবং বাকি থাকা লুপগুলো বাতিল করে দেয়। আপনি আপনার অ্যাপের AppDelegate-এ Test Lab এর কাস্টম URL স্কিম firebase-game-loop-complete কল করে আপনার টেস্টের গতি বাড়াতে পারেন বা এটি আগেভাগে শেষ করতে পারেন। উদাহরণস্বরূপ:
সুইফট
/// End the loop by calling our custom url scheme.
func finishLoop() {
let url = URL(string: "firebase-game-loop-complete://")!
UIApplication.shared.open(url)
}
উদ্দেশ্য-সি
- (void)finishLoop {
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"firebase-game-loop-complete://"]
options:@{}
completionHandler:^(BOOL success) {}];
}
আপনার গেম লুপ টেস্টটি বর্তমান লুপটি বন্ধ করে পরবর্তী লুপটি চালু করে। যখন চালানোর মতো আর কোনো লুপ থাকে না, তখন টেস্টটি শেষ হয়ে যায়।
কাস্টম পরীক্ষার ফলাফল লিখুন
আপনি আপনার ডিভাইসের ফাইল সিস্টেমে কাস্টম পরীক্ষার ফলাফল লেখার জন্য আপনার গেম লুপ পরীক্ষাটি কনফিগার করতে পারেন। এইভাবে, যখন পরীক্ষাটি চলতে শুরু করে, Test Lab আপনার টেস্টিং ডিভাইসে (যা আপনাকে অবশ্যই নিজে তৈরি করতে হবে) একটি GameLoopsResults ডিরেক্টরিতে ফলাফলের ফাইলগুলি সংরক্ষণ করে। পরীক্ষা শেষ হলে, Test Lab GameLoopResults ডিরেক্টরি থেকে সমস্ত ফাইল আপনার প্রোজেক্টের বাকেটে স্থানান্তর করে। আপনার পরীক্ষা সেট আপ করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
ফাইলের ধরন, আকার বা পরিমাণ নির্বিশেষে সমস্ত ফলাফল ফাইল আপলোড করা হয়।
আপনার টেস্টের সমস্ত লুপ চালানো শেষ না হওয়া পর্যন্ত Test Lab আপনার পরীক্ষার ফলাফল প্রক্রিয়া করে না। তাই, যদি আপনার টেস্টে আউটপুট লেখার মতো একাধিক লুপ থাকে, তবে নিশ্চিত করুন যে আপনি সেগুলোকে একটি স্বতন্ত্র ফলাফল ফাইলে যুক্ত করছেন অথবা প্রতিটি লুপের জন্য একটি করে ফলাফল ফাইল তৈরি করছেন। এভাবে, আপনি পূর্ববর্তী লুপের ফলাফল ওভাররাইট হওয়া এড়াতে পারবেন।
কাস্টম পরীক্ষার ফলাফল লেখার জন্য আপনার পরীক্ষা সেট আপ করতে:
আপনার অ্যাপের
Documentsডিরেক্টরিতেGameLoopResultsনামে একটি ডিরেক্টরি তৈরি করুন।আপনার অ্যাপের কোডের যেকোনো জায়গা থেকে (যেমন, আপনার অ্যাপ ডেলিগেট), নিম্নলিখিতটি যোগ করুন:
সুইফট
/// Write to a results file. func writeResults() { let text = "Greetings from game loops!" let fileName = "results.txt" let fileManager = FileManager.default do { let docs = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let resultsDir = docs.appendingPathComponent("GameLoopResults") try fileManager.createDirectory( at: resultsDir, withIntermediateDirectories: true, attributes: nil) let fileURL = resultsDir.appendingPathComponent(fileName) try text.write(to: fileURL, atomically: false, encoding: .utf8) } catch { // ...Handle error writing to file. } }উদ্দেশ্য-সি
/// Write to a results file. - (void)writeResults:(NSString *)message { // Locate and create the results directory (if it doesn't exist already). NSFileManager *manager = [NSFileManager defaultManager]; NSURL* url = [[manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSURL* resultsDir = [url URLByAppendingPathComponent:@"GameLoopResults" isDirectory:YES]; [manager createDirectoryAtURL:resultsDir withIntermediateDirectories:NO attributes:nil error:nil]; // Write the result message to a text file. NSURL* resultFile = [resultsDir URLByAppendingPathComponent:@"result.txt"]; if ([manager fileExistsAtPath:[resultFile path]]) { // Append to the existing file NSFileHandle *handle = [NSFileHandle fileHandleForWritingToURL:resultFile error:nil]; [handle seekToEndOfFile]; [handle writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; [handle closeFile]; } else { // Create and write to the file. [message writeToURL:resultFile atomically:NO encoding:NSUTF8StringEncoding error:nil]; } }
ধাপ ৩ : আপনার অ্যাপে স্বাক্ষর করুন
অ্যাপের সমস্ত আর্টিফ্যাক্ট যেন স্বাক্ষরিত থাকে, তা নিশ্চিত করুন। উদাহরণস্বরূপ, আপনি Xcode-এর মাধ্যমে প্রভিশনিং প্রোফাইল এবং আইডেন্টিটির মতো সাইনিং সেটিংস নির্দিষ্ট করে এটি করতে পারেন। আরও তথ্যের জন্য দেখুন: Apple Codesigning
ধাপ ৪ : আপলোড করার জন্য আপনার অ্যাপটি প্যাকেজ করুন।
আপনার অ্যাপের জন্য একটি IPA ফাইল তৈরি করুন (পরে আপনার এটি খুঁজে বের করার প্রয়োজন হবে)।
প্রদর্শিত ড্রপ-ডাউন মেনু থেকে, প্রোডাক্ট > আর্কাইভ-এ ক্লিক করুন। সবচেয়ে সাম্প্রতিক আর্কাইভটি নির্বাচন করুন, তারপর ডিস্ট্রিবিউট অ্যাপ-এ ক্লিক করুন।
প্রদর্শিত উইন্ডোতে, ডেভেলপমেন্ট > নেক্সট-এ ক্লিক করুন।
এক্সপোর্ট-এ ক্লিক করুন, এরপর একটি ডিরেক্টরি লিখুন যেখানে আপনি আপনার অ্যাপের IPA ফাইলটি ডাউনলোড করতে চান।
ধাপ ৫ : অ্যাপের স্বাক্ষর যাচাই করুন
- .ipa ফাইলটি আনজিপ করে
codesign --verify --deep --verbose /path/to/MyApp.appচালান, যেখানে "MyApp" হলো আনজিপ করা ফোল্ডারের ভেতরের অ্যাপটির নাম (যা প্রতিটি প্রজেক্টের জন্য ভিন্ন হতে পারে)। এর মাধ্যমে অ্যাপের সিগনেচার যাচাই করুন। প্রত্যাশিত আউটপুট হলোMyApp.app: valid on disk।
ধাপ ৬ : আপনার টেস্টটি স্থানীয়ভাবে চালান
Test Lab এ চালানোর আগে, আপনি আপনার টেস্টটি স্থানীয়ভাবে চালিয়ে এর আচরণ যাচাই করে নিতে পারেন। স্থানীয়ভাবে পরীক্ষা করার জন্য, একটি সিমুলেটরে আপনার গেমিং অ্যাপটি লোড করুন এবং চালান:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://
instruments -s devicesকমান্ডটি চালিয়ে আপনি আপনার সিমুলেটরের UDID খুঁজে নিতে পারেন।যদি কেবল একটি সিমুলেটর চালু থাকে, তাহলে SIMULATOR_UDID এর জায়গায় বিশেষ স্ট্রিং
"booted"লিখুন।
আপনার টেস্টে একাধিক লুপ থাকলে, scenario ফ্ল্যাগে লুপ নম্বরটি পাস করে আপনি কোন লুপটি চালাতে চান তা নির্দিষ্ট করে দিতে পারেন। মনে রাখবেন, স্থানীয়ভাবে টেস্ট চালানোর সময় আপনি একবারে শুধুমাত্র একটি লুপই চালাতে পারবেন। উদাহরণস্বরূপ, আপনি যদি লুপ ১, ২ এবং ৫ চালাতে চান, তবে আপনাকে প্রতিটি লুপের জন্য আলাদা কমান্ড চালাতে হবে:
xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=1xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=2xcrun simctl openurl SIMULATOR_UDID firebase-game-loop://?scenario=5
পরবর্তী পদক্ষেপ
Firebase কনসোল অথবা gcloud CLI ব্যবহার করে আপনার পরীক্ষাটি চালান।