গেম লুপ টেস্টের মাধ্যমে, আপনি আপনার গেম ইঞ্জিনের জন্য নিজস্ব টেস্ট লিখতে পারেন এবং তারপর আপনার পছন্দের ডিভাইসগুলোতে Test Lab সেগুলো চালাতে পারেন। এইভাবে, আপনাকে বিভিন্ন UI বা টেস্টিং ফ্রেমওয়ার্কের জন্য টেস্ট লেখার বিষয়ে চিন্তা করতে হবে না। একটি গেম লুপ টেস্ট একজন আসল খেলোয়াড়ের কার্যকলাপকে অনুকরণ করে, এবং যখন আপনি এটি Test Lab চালান, তখন এটি আপনার গেমটি ব্যবহারকারীদের জন্য ভালোভাবে কাজ করছে কিনা তা যাচাই করার একটি দ্রুত এবং পরিমাপযোগ্য উপায় প্রদান করে।
এই পৃষ্ঠাটি আপনাকে দেখাবে কীভাবে একটি গেম লুপ টেস্ট চালাতে হয় এবং তারপরে Firebase কনসোলের Test Lab পৃষ্ঠায় আপনার পরীক্ষার ফলাফল দেখতে ও পরিচালনা করতে হয়। এছাড়াও আপনি ঐচ্ছিক বৈশিষ্ট্যগুলির মাধ্যমে আপনার পরীক্ষাগুলিকে আরও কাস্টমাইজ করতে পারেন, যেমন কাস্টম পরীক্ষার ফলাফল লেখা বা আপনার পরীক্ষা সময়ের আগেই শেষ করা ।
গেম লুপ টেস্ট কী?
একটি লুপ হলো আপনার গেমিং অ্যাপে করা পরীক্ষার একটি সম্পূর্ণ বা আংশিক পুনরাবৃত্তি। আপনি একটি গেম লুপ টেস্ট স্থানীয়ভাবে একটি সিমুলেটরে অথবা Test Lab একাধিক ডিভাইসে চালাতে পারেন। গেম লুপ টেস্ট নিম্নলিখিত কাজে ব্যবহার করা যেতে পারে:
একজন সাধারণ ব্যবহারকারী যেভাবে খেলবে, সেভাবে আপনার গেমটি তৈরি করুন। আপনি ব্যবহারকারীর ইনপুট স্ক্রিপ্ট করতে পারেন, ব্যবহারকারীকে নিষ্ক্রিয় রাখতে পারেন, অথবা ব্যবহারকারীর পরিবর্তে একটি এআই (AI) ব্যবহার করতে পারেন (উদাহরণস্বরূপ, যদি আপনি একটি গাড়ি রেসিং গেমে এআই প্রয়োগ করেন, তবে ব্যবহারকারীর ইনপুটের দায়িত্বে একজন এআই ড্রাইভারকে রাখতে পারেন)।
আপনার গেমটি সর্বোচ্চ কোয়ালিটি সেটিংসে চালান, তাহলেই জানতে পারবেন কোন কোন ডিভাইসে এটি সাপোর্ট করবে।
একটি প্রযুক্তিগত পরীক্ষা চালান, যেমন একাধিক শেডার কম্পাইল করে, সেগুলো এক্সিকিউট করে এবং আউটপুট প্রত্যাশিত কিনা তা যাচাই করুন।
ধাপ ১: Test Lab কাস্টম ইউআরএল স্কিম নিবন্ধন করুন।
প্রথমে, আপনাকে আপনার অ্যাপে Firebase Test Lab এর কাস্টম URL স্কিমটি রেজিস্টার করতে হবে:
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).
}
}
}
ধাপ ৩: একটি টেস্ট তৈরি করুন এবং চালান
Test Lab -এর কাস্টম ইউআরএল স্কিম রেজিস্টার করার পর, আপনি Firebase কনসোলে অথবা gcloud beta CLI ব্যবহার করে আপনার টেস্ট চালাতে পারবেন। যদি আগে থেকে না করে থাকেন, তবে আপনার অ্যাপের জন্য একটি IPA ফাইল তৈরি করুন (পরে আপনার এটি খুঁজে বের করার প্রয়োজন হবে)।
Firebase কনসোলে একটি পরীক্ষা চালান
যদি আগে থেকে না করে থাকেন, তাহলে Firebase কনসোলটি খুলুন এবং একটি প্রজেক্ট তৈরি করুন।
Firebase কনসোলের Test Lab পেজে, Run Your First Test > Run an iOS Game Loop-এ ক্লিক করুন।
আপলোড অ্যাপ বিভাগে, ব্রাউজ-এ ক্লিক করুন, তারপর আপনার অ্যাপের IPA ফাইলটি নির্বাচন করুন (যদি আগে থেকে তৈরি না করে থাকেন, তবে আপনার অ্যাপের জন্য একটি IPA ফাইল তৈরি করুন )।
ঐচ্ছিক : আপনি যদি একই সময়ে একাধিক লুপ (যাকে সিনারিও বলা হয়) চালাতে চান অথবা চালানোর জন্য নির্দিষ্ট লুপ নির্বাচন করতে চান, তাহলে সিনারিও ফিল্ডে লুপ নম্বরগুলো লিখুন।
উদাহরণস্বরূপ, যখন আপনি "1-3, 5" প্রবেশ করান, Test Lab লুপ 1, 2, 3 এবং 5 চালায়। ডিফল্টরূপে (যদি আপনি সিনারিও ফিল্ডে কিছু প্রবেশ না করেন), Test Lab শুধুমাত্র লুপ 1 চালায়।
ডিভাইসেস সেকশনে, আপনার অ্যাপটি পরীক্ষা করার জন্য এক বা একাধিক ফিজিক্যাল ডিভাইস নির্বাচন করুন, তারপর স্টার্ট টেস্টস-এ ক্লিক করুন।
gcloud beta CLI দিয়ে একটি পরীক্ষা চালান
যদি আগে থেকে না করে থাকেন, তাহলে আপনার স্থানীয় gcloud SDK পরিবেশটি কনফিগার করুন, এরপর gcloud বিটা কম্পোনেন্টটি ইনস্টল করে নিন।
gcloud beta firebase test ios runকমান্ডটি চালান এবং রানটি কনফিগার করতে নিম্নলিখিত ফ্ল্যাগগুলি ব্যবহার করুন:
| গেম লুপ পরীক্ষার জন্য ফ্ল্যাগ | |
|---|---|
--type | আবশ্যক : আপনি কোন ধরনের iOS টেস্ট চালাতে চান তা নির্দিষ্ট করুন। আপনি টেস্ট টাইপ হিসেবে |
--app | আবশ্যক : আপনার অ্যাপের IPA ফাইলের অ্যাবসোলিউট পাথ ( Google Cloud Storage বা ফাইলসিস্টেম)। এই ফ্ল্যাগটি শুধুমাত্র গেম লুপ টেস্ট চালানোর সময় বৈধ। |
--scenario-numbers | আপনার অ্যাপে আপনি যে লুপগুলো (বা সিনারিও) চালাতে চান। আপনি একটি লুপ, লুপের একটি তালিকা, অথবা লুপের একটি পরিসর প্রবেশ করাতে পারেন। ডিফল্ট লুপ হলো ১। উদাহরণস্বরূপ, |
--device-model | যে ভৌত ডিভাইসটিতে আপনি আপনার পরীক্ষাটি চালাতে চান (খুঁজে বের করুন কোন কোন উপলব্ধ ডিভাইস আপনি ব্যবহার করতে পারবেন)। |
--timeout | আপনার পরীক্ষাটি চালানোর সর্বোচ্চ সময়কাল। আপনি সেকেন্ডে সময়কাল বোঝানোর জন্য একটি পূর্ণসংখ্যা, অথবা দীর্ঘতর সময়ের একক হিসাবে সময়কাল বোঝানোর জন্য একটি পূর্ণসংখ্যা এবং এনুমারেশন লিখতে পারেন। উদাহরণস্বরূপ:
|
উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি একটি iPhone 8 Plus-এ একটি গেম লুপ টেস্ট চালায় যা লুপ ১, ৪, ৬, ৭, এবং ৮ কার্যকর করে:
gcloud beta firebase test ios run --type game-loop --app path/to/my/App.ipa --scenario-numbers 1,4,6-8 --device-model=iphone8plus
gcloud CLI সম্পর্কে আরও তথ্যের জন্য, রেফারেন্স ডকুমেন্টেশন দেখুন।
স্থানীয়ভাবে একটি পরীক্ষা চালান
আপনার পরীক্ষাটি স্থানীয়ভাবে চালানোর জন্য, একটি সিমুলেটরে আপনার গেমিং অ্যাপটি লোড করুন এবং চালান:
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
একটি পরীক্ষা তাড়াতাড়ি শেষ করুন
ডিফল্টরূপে, একটি গেম লুপ টেস্ট পাঁচ মিনিটের টাইমআউটে না পৌঁছানো পর্যন্ত চলতে থাকে, এমনকি যখন সমস্ত লুপ এক্সিকিউট হয়ে যায় তখনও। টাইমআউট শেষ হলে, টেস্টটি শেষ হয়ে যায় এবং বাকি থাকা লুপগুলো বাতিল করে দেয়। আপনি আপনার অ্যাপের 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]; } }