XCTest হল Apple-এর একটি ফ্রেমওয়ার্ক যা iOS, macOS, watchOS এবং tvOS-এর জন্য অ্যাপ্লিকেশনের ইউনিট এবং ইন্টিগ্রেশন পরীক্ষার জন্য। XCTest Xcode-এর অংশ এবং Swift ও Objective-C-এ টেস্ট লেখার সমর্থন করে। তৃতীয়-পক্ষের ফ্রেমওয়ার্ক (Quick, Nimble) থেকে ভিন্ন, XCTest হল Apple-এর অফিসিয়াল সমাধান এবং Xcode Server ও CI/CD-এর সাথে সম্পূর্ণরূপে সংহত। Apple Developer (2024) অনুসারে, App Store-এর শীর্ষ 100-এ থাকা 94% iOS অ্যাপ্লিকেশনে XCTest ব্যবহৃত হয়। XCTest বাহ্যিক নির্ভরতা ছাড়াই ইউনিট টেস্ট এবং UI টেস্ট লেখার জন্য একটি স্থিতিশীল ভিত্তি প্রদান করে।
মূল বিষয়
XCTest হল ইউনিট, ইন্টিগ্রেশন এবং UI পরীক্ষার জন্য একটি ফ্রেমওয়ার্ক যা Apple তৈরি করেছে এবং Xcode-এ সংস্করণ 5.0 (2013) থেকে নির্মিত। XCTest OCUnit (SenTestingKit)-কে প্রতিস্থাপন করেছে এবং অ্যাসিনক্রোনাস টেস্ট, পারফরম্যান্স টেস্ট এবং Xcode Server সংহতির সমর্থন সহ Swift-এ একটি আধুনিক API প্রদান করেছে। Swift.org (2024) অনুসারে, XCTest是所有 Apple প্রকল্পে পরীক্ষার ভিত্তি, যার মধ্যে Swift Package Manager অন্তর্ভুক্ত, যা স্ব-যাচাইয়ের জন্য XCTest ব্যবহার করে।
XCTest Xcode Test Navigator এবং Report Navigator-এর সাথে কাজ করে, যা টেস্ট ট্রি, রানের ইতিহাস দেখায় এবং বিল্ডের মধ্যে ফলাফল তুলনা করে। Test Navigator কোড পরিবর্তন না করে একটি টেস্ট, টেস্টের গ্রুপ বা সম্পূর্ণ স্যুট চালানোর অনুমতি দেয়। ফলাফল সবুজ (পাস), লাল (ফেল) এবং হলুদ (স্কিপ) আইকন সহ প্রদর্শিত হয়। Apple WWDC (2024) অনুসারে, Xcode 16 একাধিক সিমুলেটর ব্যবহার করে সমান্তরাল টেস্ট নির্বাহে 40% উন্নতি করেছে।
XCTest প্ল্যাটফর্ম সমর্থন করে: iOS 8.0+, macOS 10.10+, watchOS 2.0+, tvOS 9.0+. প্রতিটি প্ল্যাটফর্মের একই API রয়েছে, যা ক্রস-প্ল্যাটফর্ম টেস্ট লেখার অনুমতি দেয়। Swift Testing — Apple-এর একটি নতুন ফ্রেমওয়ার্ক (2024-এ ঘোষিত) — ভবিষ্যতে XCTest-এর পরিপূরক হবে কিন্তু এটি সম্পূর্ণরূপে প্রতিস্থাপন করবে না। XCTest Apple ইকোসিস্টেমে প্রাথমিক পরীক্ষার ফ্রেমওয়ার্ক হিসাবে রয়ে গেছে।
XCTestCase হল বেস ক্লাস যা থেকে XCTest-এর সমস্ত টেস্ট ক্লাস উত্তরাধিকার সূত্রে প্রাপ্ত হয়। এটি টেস্ট জীবনচক্র প্রদান করে: প্রতিটি টেস্টের আগে `setUp()` বলা হয়, প্রতিটি টেস্টের পরে `tearDown()` বলা হয়। setUp অবজেক্ট এবং মক আরম্ভ করার জন্য ব্যবহৃত হয়, tearDown সম্পদ পরিষ্কার করার জন্য। setUpWithError এবং tearDownWithError প্রতিটি টেস্টে try-catch ছাড়াই আরম্ভকরণ ত্রুটিগুলি পরিচালনা করার অনুমতি দেয়।
প্রতিটি পদ্ধতি যার নাম `test` দিয়ে শুরু হয়, স্বয়ংক্রিয়ভাবে Xcode দ্বারা একটি টেস্ট হিসাবে স্বীকৃত হয়। বিকল্পভাবে, `@Test` ম্যাক্রো (Swift Testing) ব্যবহার করা যেতে পারে। টেস্টের নাম বর্ণনামূলক হওয়া উচিত: `testLoginWithValidCredentials` `testLogin1`-এর চেয়ে ভাল। মন্তব্যের মাধ্যমে টেস্টের ডকুমেন্টেশন একটি ভাল অভ্যাস, কিন্তু Xcode User-Defined Attributes-এর মাধ্যমে বিবরণ যোগ করার অনুমতি দেয়।
import XCTest
class UserServiceTests: XCTestCase {
var sut: UserService!
var mockSession: MockURLSession!
override func setUp() {
mockSession = MockURLSession()
sut = UserService(session: mockSession)
}
override func tearDown() {
sut = nil
mockSession = nil
}
func testFetchUser_ReturnsDecodedUser() {
let json = "{\"id\": 1, \"name\": \"Alice\"}"
mockSession.setResponse(json)
let user = try await sut.fetchUser(id: 1)
XCTAssertEqual(user.name, "Alice")
}
}
উপরের উদাহরণটি মানক XCTestCase গঠন প্রদর্শন করে। sut (সিস্টেম আন্ডার টেস্ট) পরীক্ষা করা বস্তুর জন্য একটি নামকরণের রীতি। MockURLSession প্রকৃত নেটওয়ার্ক প্রতিস্থাপন করে, যা UserService-কে বিচ্ছিন্নভাবে পরীক্ষা করার অনুমতি দেয়। “একটি টেস্ট — একটি অ্যাসার্শন”-এর নীতি ডিবাগিং সহজ করে: যদি একটি টেস্ট ব্যর্থ হয়, ডেভেলপার অবিলম্বে জানতে পারে কোন কার্যকারিতা ভাঙা হয়েছে। প্রতিটি XCTestCase টেস্ট একটি পরিস্থিতি বা একটি অ্যাসার্শন যাচাই করা উচিত।
XCTAssertTrue এবং XCTAssertFalse বুলিয়ান মান যাচাই করার জন্য মৌলিক অ্যাসার্শন। XCTAssertTrue(expression) পাস হয় যদি expression == true হয়। XCTAssertEqual Equatable প্রয়োগ করে এমন সমস্ত প্রকারের সমর্থন সহ দুটি মানের সমতা যাচাই করে। ফ্লোটিং-পয়েন্ট সংখ্যার জন্য, গণনার নির্ভুলতা বিবেচনায় নিতে accuracy প্যারামিটার সহ XCTAssertEqual ব্যবহার করা হয়। Google Testing Blog (2024) অনুসারে, XCTAssertEqual একটি সাধারণ টেস্ট স্যুটে সমস্ত যাচাইয়ের 70% কভার করে।
XCTAssertNil এবং XCTAssertNotNil nil-এর জন্য ঐচ্ছিক মান যাচাই করে। Swift-এ এই অ্যাসার্শনগুলি গুরুত্বপূর্ণ, যেখানে ঐচ্ছিক প্রকারগুলি ব্যাপকভাবে ব্যবহৃত হয়। XCTAssertThrowsError যাচাই করে যে কোডটি প্রত্যাশিত ত্রুটি ছুঁড়ে দেয়। XCTUnwrap是一个 অ্যাসার্শন যা একটি ঐচ্ছিক মান আনর্যাপ করে এবং মানটি nil হলে স্পষ্ট বার্তা সহ ব্যর্থ হয়। XCTAssertEqual-এর মাধ্যমে স্ট্রিং তুলনা আক্ষরিক তুলনা ব্যবহার করে, শব্দার্থিক নয়। XCTAssertNoThrow হল যুগ্ম অ্যাসার্শন যা যাচাই করে যে কোডটি ত্রুটি ছুঁড়ে দেয় না।
| অ্যাসার্শন | উদ্দেশ্য | উদাহরণ |
|---|---|---|
| XCTAssertEqual | সমতা যাচাই | XCTAssertEqual(a, b) |
| XCTAssertTrue | সত্যতা যাচাই | XCTAssertTrue(result) |
| XCTAssertNil | Nil যাচাই | XCTAssertNil(error) |
| XCTAssertThrowsError | ত্রুটি যাচাই | XCTAssertThrowsError(try parse("")) |
| XCTUnwrap | Optional আনর্যাপিং | XCTUnwrap(value) |
XCTestExpectation হল অ্যাসিনক্রোনাস কোড পরীক্ষার জন্য একটি প্রক্রিয়া। টেস্টটি একটি বর্ণনামূলক নাম সহ একটি প্রত্যাশা তৈরি করে, এটি একটি অ্যাসিনক্রোনাস অপারেশনে পাঠায় এবং `wait(for:timeout:)` কল করে। যদি প্রত্যাশাটি টাইমআউটের মধ্যে পূরণ না হয়, টেস্টটি ব্যর্থ হয়। টাইমআউট ডিফল্টভাবে 10 সেকেন্ড, কিন্তু দ্রুত অপারেশনের জন্য সামগ্রিক পরীক্ষার সময় গতি বাড়াতে 1–3 সেকেন্ড সেট করার পরামর্শ দেওয়া হয়।
XCTWaiter হল wait(for:timeout:)-এর আরও নমনীয় বিকল্প। XCTWaiter একাধিক প্রত্যাশার অপেক্ষা করতে, নির্বাহের ক্রম কনফিগার করতে এবং প্রোগ্রামেটিকভাবে টাইমআউট পরিচালনা করতে দেয়। wait-এর বিপরীতে, XCTWaiter `XCTWaiter.Result` ফেরত দেয়, যা বিশ্লেষণ করা যেতে পারে। ডেলিগেট XCTWaiterDelegate প্রত্যাশা ক্রম লঙ্ঘন এবং টাইমআউট সম্পর্কে অবহিত করে।
func testAsyncLogin() {
let expectation = XCTestExpectation(description: "login")
var resultUser: User?
sut.login(email: "a@b.com", password: "123") { user in
resultUser = user
expectation.fulfill()
}
wait(for: [expectation], timeout: 3)
XCTAssertNotNil(resultUser)
XCTAssertEqual(resultUser?.email, "a@b.com")
}
উদাহরণে, XCTestExpectation একটি অ্যাসিনক্রোনাস লগইন পরীক্ষার জন্য ব্যবহৃত হয়। কলব্যাক ক্লোজারের ভিতরে fulfill() বলা হয়, যা ইঙ্গিত দেয় যে অ্যাসিনক্রোনাস অপারেশন সম্পূর্ণ হয়েছে। যদি 3 সেকেন্ডের মধ্যে fulfill() কল না করা হয়, টেস্টটি টাইমআউটের সাথে ব্যর্থ হয়। সফল অপেক্ষার পরে, ফলাফল যাচাই করার জন্য অ্যাসার্শন করা হয়। একাধিক প্রত্যাশা একটি অ্যারে হিসাবে পাঠানো যেতে পারে এবং সবগুলির সম্পূর্ণ হওয়ার অপেক্ষা করা যেতে পারে।
measure(metrics:) হল পারফরম্যান্স টেস্ট তৈরি করার জন্য XCTestCase পদ্ধতি। measure-এর ভিতরে কোড ব্লকটি ধারাবাহিকভাবে 10 বার চলে, এবং XCTest পরিসংখ্যান সংগ্রহ করে: গড় সময়, মধ্যমা, প্রমিত বিচ্যুতি। মেট্রিক্স হল ট্র্যাক করা মেট্রিক্সের একটি অ্যারে: XCTClockMetric (সময়), XCTMemoryMetric (মেমোরি), XCTStorageMetric (ডিস্ক), এবং XCTCPUMetric (প্রসেসর)। Apple WWDC (2024) অনুসারে, XCTCPUMetric-এর সাথে পারফরম্যান্স টেস্ট অ্যালগরিদমে রিগ্রেশন সনাক্ত করার জন্য দরকারী।
পারফরম্যান্স টেস্টের জন্য বেসলাইন Xcode Test Plan-এ সেট করা হয়। যদি নির্বাহের সময় একটি নির্ধারিত শতাংশ (ডিফল্ট 10%) দ্বারা বেসলাইন অতিক্রম করে, টেস্টটি ব্যর্থ বলে বিবেচিত হয়। বেসলাইনটি ম্যানুয়ালি আপডেট করা হয় নিশ্চিত করার পরে যে কর্মক্ষমতা পরিবর্তনটি প্রত্যাশিত। Xcode-এ Test Plan কনফিগারেশন অনুসারে পারফরম্যান্স টেস্ট গ্রুপ করার অনুমতি দেয়: debug/release, বিভিন্ন ডিভাইস, বিভিন্ন iOS সংস্করণ।
func testArraySortPerformance() {
let numbers = (1...10000).shuffled()
measure(metrics: [XCTClockMetric()]) {
let _ = numbers.sorted()
}
}
এই পারফরম্যান্স টেস্টটি 10,000 উপাদানের একটি অ্যারের সাজানোর সময় পরিমাপ করে। XCTClockMetric প্রকৃত নির্বাহের সময় ক্যাপচার করে। যদি সাজানোর অ্যালগরিদম পরিবর্তন করার পরে সময় 10% বা তার বেশি বেড়ে যায়, টেস্টটি একটি রিগ্রেশন নির্দেশ করবে। XCTest পারফরম্যান্স টেস্টগুলি বিশেষভাবে দরকারী: ডেটা প্রসেসিং অ্যালগরিদম, UI উপাদান রেন্ডারিং, ডেটাবেস অপারেশন এবং নেটওয়ার্ক অনুরোধের জন্য।
টেস্ট প্রকল্পের গঠন XCTest-এ রীতি অনুসরণ করে: প্রতি ক্লাসে একটি টেস্ট ফাইল, একটি পৃথক `<TargetName>Tests` ডিরেক্টরিতে রাখা হয়। ফাইলের নাম `Tests` প্রত্যয় সহ পরীক্ষিত ক্লাসের নামের সাথে মেলে: `UserService.swift` → `UserServiceTests.swift`. Xcode-এ Test Targets ইউনিট টেস্ট এবং UI টেস্টের জন্য আলাদাভাবে কনফিগার করা হয়, যা তাদের স্বাধীনভাবে চালানোর অনুমতি দেয়। Xcode-এ Schemes বিল্ড কনফিগারেশন এবং চালানোর জন্য টেস্টের সেট পরিচালনা করে।
Xcode Cloud এবং GitHub Actions `xcodebuild test -scheme App -testPlan SmokeTest`-এর মাধ্যমে XCTest চালানোর সমর্থন করে। CI পাইপলাইনে অন্তর্ভুক্ত: বিল্ড → ইউনিট টেস্ট চালানো → UI টেস্ট চালানো → রিপোর্ট প্রকাশ করা। JUnit রিপোর্ট `-resultBundlePath` বিকল্প সহ `xcodebuild`-এর মাধ্যমে উত্পন্ন হয় এবং যেকোনো CI টুলে আমদানি করা যেতে পারে। কোড কভারেজ হল XCTest-এর একটি অন্তর্নির্মিত বৈশিষ্ট্য যা দেখায় কোডের কোন লাইনগুলি টেস্ট দ্বারা আচ্ছাদিত। প্রোডাকশন কোডের জন্য ন্যূনতম কভারেজ সীমা গুরুত্বপূর্ণ ব্যবসায়িক যুক্তির জন্য 70%।
Xcode Cloud এবং GitHub Actions `xcodebuild test -scheme App -testPlan SmokeTest`-এর মাধ্যমে XCTest চালানোর সমর্থন করে। CI পাইপলাইনে অন্তর্ভুক্ত: বিল্ড → ইউনিট টেস্ট চালানো → UI টেস্ট চালানো → রিপোর্ট প্রকাশ করা। JUnit রিপোর্ট `-resultBundlePath` বিকল্প সহ `xcodebuild`-এর মাধ্যমে উত্পন্ন হয় এবং যেকোনো CI টুলে আমদানি করা যেতে পারে। Bitrise এবং Jenkins-এর XCTest-এর জন্য প্রস্তুত ধাপ রয়েছে।
কোড কভারেজ হল XCTest-এর একটি অন্তর্নির্মিত বৈশিষ্ট্য যা দেখায় কোডের কোন লাইনগুলি টেস্ট দ্বারা আচ্ছাদিত। Xcode কভারেজ সবুজ (আচ্ছাদিত), লাল (আচ্ছাদিত নয়) এবং হলুদ (আংশিকভাবে আচ্ছাদিত) রঙে প্রদর্শন করে। প্রোডাকশন কোড কভারেজের জন্য ন্যূনতম সীমা গুরুত্বপূর্ণ ব্যবসায়িক যুক্তির জন্য 70%। Google Testing Blog (2024) অনুসারে, সমস্ত মডিউলের জন্য 80% কভারেজ প্রয়োগ করলে “খালি টেস্ট” হয় যা যুক্তি যাচাই করে না বরং শুধু কোড নির্বাহ করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
XCTest হল Apple-এর অফিসিয়াল ফ্রেমওয়ার্ক যা Xcode-এর সাথে সরাসরি সংহত। Quick এবং Nimble হল তৃতীয়-পক্ষের লাইব্রেরি যা BDD সিনট্যাক্স এবং আরও পঠনযোগ্য অ্যাসার্শন প্রদান করে। Quick এবং Nimble অ্যাকসেপ্টেন্স টেস্টিং-এর জন্য সুবিধাজনক, কিন্তু XCTest বাহ্যিক নির্ভরতার অনুপস্থিতির কারণে ইউনিট টেস্টের জন্য আরও নির্ভরযোগ্য।
অ্যাসিনক্রোনাস কোড XCTestExpectation + `wait(for:timeout:)` বা XCTest-এর `async/await` পদ্ধতি (iOS 13+) এর মাধ্যমে পরীক্ষা করা হয়। কলব্যাক-ভিত্তিক API-র জন্য, একটি প্রত্যাশা তৈরি করা হয় যা ক্লোজারে পূরণ হয়। async/await-এর জন্য, async ফাংশনে মানক অ্যাসার্শন ব্যবহার করা হয়।
XCTest-এ কোনও অন্তর্নির্মিত মকিং ফ্রেমওয়ার্ক অন্তর্ভুক্ত নয়। মকিং প্রোটোকলের মাধ্যমে বাস্তবায়িত হয়: একটি মক ক্লাস তৈরি করা হয় যা প্রকৃত নির্ভরতার মতো একই প্রোটোকল প্রয়োগ করে। স্বয়ংক্রিয় মক জেনারেশনের জন্য, Cuckoo, SwiftyMocky বা ম্যানুয়াল মক ব্যবহার করা হয়। আরম্ভকারীর মাধ্যমে ডিপেন্ডেন্সি ইনজেকশন পরীক্ষাযোগ্যতার জন্য একটি বাধ্যতামূলক শর্ত।
হ্যাঁ, XCTest আসল ডিভাইসে Xcode বা xcodebuild-এর মাধ্যমে `-destination 'platform=iOS,name=iPhone 15'` প্যারামিটার সহ চলে। আসল ডিভাইসে UI টেস্ট সিমুলেটরের চেয়ে আরও সঠিক ফলাফল দেয়। ডিভাইস ফার্মে চালানোর জন্য, BrowserStack, Sauce Labs বা Firebase Test Lab ব্যবহার করা হয়।
Swift Testing (2024) হল `@Test`, `@Suite` এবং `@Expect` ম্যাক্রো সহ একটি নতুন Apple ফ্রেমওয়ার্ক। এটি অন্তর্নির্মিত টেস্ট প্যারামিটারাইজেশন, স্যুট গ্রুপিং এবং আরও পঠনযোগ্য সিনট্যাক্স প্রদান করে। Swift Testing XCTest-এর সাথে সহাবস্থান করে এবং এটি প্রতিস্থাপন করে না। XCTest UI টেস্ট এবং পারফরম্যান্স টেস্টের জন্য প্রাথমিক ফ্রেমওয়ার্ক হিসাবে রয়ে গেছে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন