{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-267", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/267", "wordCount": 2891, "segments": [{"start": 7.0, "text": "Hi! My name is Jerry, and I'm an engineer on the Swift Testing team."}, {"start": 11.0, "text": "Today, I'll share how it's easier than ever"}, {"start": 13.0, "text": "to migrate from XCTest to Swift Testing."}, {"start": 17.0, "text": "We introduced Swift Testing in Xcode 16."}, {"start": 21.0, "text": "It's a modern testing library"}, {"start": 22.0, "text": "with an expressive and concise interface for writing tests."}, {"start": 27.0, "text": "It also fits right in with the Swift ecosystem."}, {"start": 29.0, "text": "For example, it was built with Swift concurrency in mind,"}, {"start": 33.0, "text": "so it runs test cases in parallel and delivers results super quickly."}, {"start": 38.0, "text": "I'll begin with a review of some Swift Testing building blocks"}, {"start": 41.0, "text": "and compare those to similar concepts from XCTest."}, {"start": 45.0, "text": "Next, I'll add Swift Testing to an XCTest project."}, {"start": 50.0, "text": "Along the way, I'll demonstrate how to reuse existing code"}, {"start": 53.0, "text": "with the test framework interoperability feature,"}, {"start": 57.0, "text": "and even if you don't use XCTest, please stick around!"}, {"start": 61.0, "text": "I'll share how to use Swift Testing features"}, {"start": 64.0, "text": "to boldly go where no XCTest has gone before!"}, {"start": 68.0, "text": "Let's get started with the basics of Swift Testing."}, {"start": 72.0, "text": "I begin a test file by importing the Swift Testing framework"}, {"start": 76.0, "text": "along with a testable import to access internal types."}, {"start": 79.0, "text": "Then, I create a new function"}, {"start": 82.0, "text": "and annotate it with the @Test macro to declare it as a test."}, {"start": 87.0, "text": "Swift supports raw identifiers, which are indicated by these backticks."}, {"start": 93.0, "text": "They let me mix in spaces and punctuation to help me read longer test names."}, {"start": 97.0, "text": "In the body of the test, I use the #expect macro"}, {"start": 101.0, "text": "to create this expectation that fruits have a tropical climate."}, {"start": 105.0, "text": "That's all it takes to create a new test!"}, {"start": 108.0, "text": "The @Test and #expect macros are the core building blocks for most tests."}, {"start": 113.0, "text": "If you're totally new to Swift Testing, or you just want to jog your memory,"}, {"start": 117.0, "text": "\"Meet Swift Testing\" is a fantastic resource."}, {"start": 120.0, "text": "It covers additional building blocks and testing workflows."}, {"start": 124.0, "text": "The #expect macro is super flexible and replaces many XCTest assertions."}, {"start": 129.0, "text": "To replace XCTFail, which is an unconditional failure,"}, {"start": 134.0, "text": "use Issue.record instead."}, {"start": 137.0, "text": "With Swift Testing, you'll enjoy using less code"}, {"start": 140.0, "text": "to write more powerful and expressive tests."}, {"start": 143.0, "text": "However, keep using XCTest for a few scenarios."}, {"start": 147.0, "text": "UI automation and performance testing APIs are only available in XCTest,"}, {"start": 153.0, "text": "and when testing code that throws Objective-C exceptions,"}, {"start": 157.0, "text": "you have to use XCTests also written in Objective-C."}, {"start": 160.0, "text": "That's because Swift code, including XCTests in Swift,"}, {"start": 164.0, "text": "can't safely handle these exceptions."}, {"start": 167.0, "text": "All right, I know you're eager to write some tests now!"}, {"start": 170.0, "text": "So, I'll demonstrate how to migrate fearlessly to Swift Testing."}, {"start": 175.0, "text": "I'll explain my strategy for migrating test code in small chunks."}, {"start": 180.0, "text": "Next, I'll introduce test framework interoperability,"}, {"start": 184.0, "text": "a powerful tool that will allow me to reuse existing test code."}, {"start": 189.0, "text": "And to help your own migration go smoothly,"}, {"start": 191.0, "text": "I'll share a few common patterns to follow."}, {"start": 194.0, "text": "Ok."}, {"start": 196.0, "text": "Let's talk migration strategy."}, {"start": 199.0, "text": "When I modify old tests, I introduce risk, even for small changes."}, {"start": 203.0, "text": "So, I'm going to leave most XCTests in their place."}, {"start": 207.0, "text": "When I'm ready, I'll modify tests a few at a time"}, {"start": 211.0, "text": "and focus on the ones that I update most often."}, {"start": 214.0, "text": "My existing test targets can include tests from both frameworks."}, {"start": 218.0, "text": "So, I can already use Swift Testing for my new tests,"}, {"start": 222.0, "text": "although they can't go inside XCTest classes."}, {"start": 225.0, "text": "Ok!"}, {"start": 227.0, "text": "Now that I have a migration strategy, I'm ready to put it to the test."}, {"start": 232.0, "text": "I made an app to train birds in my neighbourhood to do fruit delivery."}, {"start": 235.0, "text": "Just like how birds migrate with the changing of the season,"}, {"start": 239.0, "text": "I think it's the season for me to also migrate to Swift Testing."}, {"start": 243.0, "text": "Here's my XCTest suite for my Fruit data structure."}, {"start": 247.0, "text": "I recently added climate information to the fruit but haven't tested it yet."}, {"start": 252.0, "text": "I think I want to add some new tests using Swift Testing,"}, {"start": 255.0, "text": "and I can do that without even leaving this file!"}, {"start": 258.0, "text": "First, I'll import the Swift Testing framework."}, {"start": 264.0, "text": "Then, I'll add my test at the end of this file."}, {"start": 270.0, "text": "By the way, I love that Swift Testing lets me put this outside of a test suite."}, {"start": 274.0, "text": "I can always create a parent suite later, once I have more tests."}, {"start": 278.0, "text": "In the Test navigator, I'm noticing the new test is already included."}, {"start": 282.0, "text": "Now, I'll go to the Product menu and select Test."}, {"start": 291.0, "text": "Great!"}, {"start": 292.0, "text": "My new test ran successfully."}, {"start": 294.0, "text": "Some of my tests require more setup."}, {"start": 298.0, "text": "This test checks in an array of fruit has all unique names."}, {"start": 302.0, "text": "I originally wrote this test"}, {"start": 303.0, "text": "with multiple lines of code to set up the assertion."}, {"start": 307.0, "text": "When I ran the test later, I found it difficult to understand why it failed."}, {"start": 312.0, "text": "This test was trying to tell a story, but it got lost in all this code."}, {"start": 316.0, "text": "So, I extracted this multi-step assertion into a helper function."}, {"start": 321.0, "text": "Now, it's clearer what I'm testing and how I'm testing it."}, {"start": 326.0, "text": "As a finishing touch,"}, {"start": 327.0, "text": "I provided file and line number parameters and passed them to XCTFail."}, {"start": 332.0, "text": "Xcode now attributes the failure to the line where I call the helper."}, {"start": 337.0, "text": "I want to create new tests with Swift Testing"}, {"start": 340.0, "text": "which also call this helper, and, ultimately, XCTFail."}, {"start": 344.0, "text": "However, XCTFail isn't part of Swift Testing."}, {"start": 348.0, "text": "This is where test framework interoperability can help!"}, {"start": 351.0, "text": "It's a feature that lets you safely call API from one test framework,"}, {"start": 356.0, "text": "while in the body of a test, from the other."}, {"start": 359.0, "text": "When considering interoperability, there's two directions to think about."}, {"start": 363.0, "text": "You can call XCTest API"}, {"start": 365.0, "text": "which reports an issue in a Swift Testing test."}, {"start": 369.0, "text": "This is what happens when I reuse my assertUnique helper which wraps XCTFail."}, {"start": 374.0, "text": "In the other direction, you can call Swift Testing API"}, {"start": 378.0, "text": "which reports an issue in an XCTest."}, {"start": 381.0, "text": "I'll explain this one later."}, {"start": 384.0, "text": "In either case, you end up creating a cross-framework issue,"}, {"start": 388.0, "text": "with the issue-reporting API and the test it's called in"}, {"start": 391.0, "text": "belong to different frameworks."}, {"start": 394.0, "text": "Xcode enables interoperability by default to handle these issues."}, {"start": 398.0, "text": "Let me show you how."}, {"start": 401.0, "text": "I call the assertUnique helper in testUniqueFruitNames."}, {"start": 406.0, "text": "The helper reports failures using XCTFail."}, {"start": 410.0, "text": "I've created another Swift Testing test with the same body."}, {"start": 414.0, "text": "This helper should report the same failure, but in this test,"}, {"start": 418.0, "text": "it's a cross-framework issue."}, {"start": 421.0, "text": "Let's compare the result after running this test."}, {"start": 426.0, "text": "Hmm, I'm noticing the test passes, but I actually thought it would fail,"}, {"start": 431.0, "text": "like the XCTest above."}, {"start": 433.0, "text": "A test failure can be a good thing,"}, {"start": 435.0, "text": "because it means my helper is working to catch bugs."}, {"start": 438.0, "text": "There's some messages here, though."}, {"start": 440.0, "text": "I'll click to view them."}, {"start": 444.0, "text": "Interoperability created two warnings, indicated by the purple triangles."}, {"start": 449.0, "text": "Because these aren't errors, the test still passes."}, {"start": 452.0, "text": "The first warning tells me that Lychee is a duplicate name,"}, {"start": 456.0, "text": "and the second warning"}, {"start": 457.0, "text": "instructs me to replace XCTFail with Issue.record from Swift Testing."}, {"start": 463.0, "text": "Interoperability comes with different modes"}, {"start": 465.0, "text": "for handling cross-framework issues."}, {"start": 468.0, "text": "I've just explained the limited mode."}, {"start": 471.0, "text": "In this mode, cross-framework issues from XCTest are warnings."}, {"start": 475.0, "text": "Test plans created before Xcode 27 inherit limited mode."}, {"start": 480.0, "text": "For new projects, Xcode uses the complete mode."}, {"start": 483.0, "text": "In this mode, those same issues stay as errors."}, {"start": 487.0, "text": "Change the mode at any time using your Test Plan Settings."}, {"start": 491.0, "text": "You can find it under the Test Execution section."}, {"start": 495.0, "text": "Let's find out how the complete mode changes my test results."}, {"start": 498.0, "text": "I'll go edit my test plan."}, {"start": 505.0, "text": "Here, I'll filter on interoperability,"}, {"start": 510.0, "text": "and I'll change that mode to Complete."}, {"start": 514.0, "text": "Now I'll go back to my \"Unique fruit names\" test, and run it again."}, {"start": 521.0, "text": "Now, my test fails."}, {"start": 523.0, "text": "Let's check the messages."}, {"start": 526.0, "text": "The complete mode preserves the error created by XCTFail."}, {"start": 530.0, "text": "It also keeps the warning that instructs me to migrate."}, {"start": 534.0, "text": "Think of complete mode as a step above limited mode."}, {"start": 538.0, "text": "It elevates cross-framework issues from warnings to errors,"}, {"start": 542.0, "text": "so you're less likely to miss them."}, {"start": 545.0, "text": "One more step above complete mode is strict mode."}, {"start": 549.0, "text": "For cross-framework issues from XCTest,"}, {"start": 552.0, "text": "strict mode stops the test in its tracks with a fatal error."}, {"start": 556.0, "text": "This helps you find places to replace XCTest API with Swift Testing API."}, {"start": 561.0, "text": "I've already updated the mode to strict."}, {"start": 564.0, "text": "Now, I'll run my test again."}, {"start": 572.0, "text": "Whoa!"}, {"start": 573.0, "text": "The test stopped exactly where I call XCTFail in my helper function!"}, {"start": 577.0, "text": "Let's check out this message."}, {"start": 581.0, "text": "Once again, I have instructions to replace XCTFail,"}, {"start": 585.0, "text": "but I have to keep in mind I still have XCTests that call this helper."}, {"start": 590.0, "text": "That's why interoperability also supports cross-framework issues from Swift Testing."}, {"start": 596.0, "text": "In all modes, those issues remain errors."}, {"start": 600.0, "text": "So, you're empowered to call Swift Testing API"}, {"start": 603.0, "text": "within tests from both frameworks."}, {"start": 606.0, "text": "Replacing XCTFail just takes a few steps."}, {"start": 610.0, "text": "I'll start by replacing the XCTest import with a Swift Testing import."}, {"start": 615.0, "text": "Then, replace XCTFail with Issue.record,"}, {"start": 619.0, "text": "and sourceLocation replaces the original file and line parameters."}, {"start": 624.0, "text": "After updating my helper, I'll run all my test cases again."}, {"start": 628.0, "text": "I'll use CMD+U, which is the shortcut for product test."}, {"start": 637.0, "text": "With the updated helper, my new test"}, {"start": 640.0, "text": "and my original XCTest both fail as expected."}, {"start": 645.0, "text": "Thanks to test framework interoperability,"}, {"start": 648.0, "text": "I replaced XCTest API with Swift Testing API"}, {"start": 651.0, "text": "without changing the meaning of my tests."}, {"start": 654.0, "text": "There's one more mode I haven't introduced yet."}, {"start": 657.0, "text": "You can set the mode to none to opt-out of interoperability."}, {"start": 661.0, "text": "After opting-out, Xcode won't report cross-framework issues"}, {"start": 664.0, "text": "in either direction,"}, {"start": 667.0, "text": "but, those issues can highlight bugs in your app."}, {"start": 670.0, "text": "You won't catch those bugs if you disable interoperability."}, {"start": 673.0, "text": "So, if you have to use this mode, only use it temporarily."}, {"start": 677.0, "text": "Instead, prefer complete or strict mode."}, {"start": 681.0, "text": "Complete mode maintains cross-framework issues as errors,"}, {"start": 684.0, "text": "and it's a worthy steup up from the limited mode."}, {"start": 688.0, "text": "The strict mode, is, well, strict!"}, {"start": 690.0, "text": "It's a great fit if you want to completely prevent"}, {"start": 693.0, "text": "cross-framework issues from XCTest."}, {"start": 695.0, "text": "You can also use interoperability"}, {"start": 697.0, "text": "and its different modes in Swift Package projects."}, {"start": 701.0, "text": "Here's an example of a project created with swift-tools-version: 6.3,"}, {"start": 706.0, "text": "and it has a test that produces a cross-framework issue from XCTest."}, {"start": 710.0, "text": "By default, the Swift 6.4 toolchain enables limited mode."}, {"start": 716.0, "text": "When I run this project with the swift test command,"}, {"start": 719.0, "text": "I notice that it reports the cross-framework issue as a warning."}, {"start": 723.0, "text": "To use complete mode, update your package to swift-tools-version 6.4 or newer."}, {"start": 731.0, "text": "After bumping the tools version, the earlier issue is now an error."}, {"start": 736.0, "text": "Override the default mode at any time using an environment variable:"}, {"start": 740.0, "text": "SWIFT_TESTING_XCTEST_INTEROP_MODE"}, {"start": 744.0, "text": "For the value, provide the name of the mode in lowercase."}, {"start": 748.0, "text": "Finally, interoperability supports a limited set of APIs"}, {"start": 752.0, "text": "from both testing frameworks."}, {"start": 755.0, "text": "I just demonstrated the XCTFail and Issue.record API."}, {"start": 760.0, "text": "In XCTest, it also supports all other test assertions,"}, {"start": 765.0, "text": "and in Swift Testing, it supports both expectation macros:"}, {"start": 768.0, "text": "#expect and #require."}, {"start": 771.0, "text": "The known issue API in Swift Testing can mark XCTest assertion failures as known,"}, {"start": 777.0, "text": "and Test.cancel can skip test cases in XCTest."}, {"start": 782.0, "text": "On your own migration journey, you might encounter some common patterns."}, {"start": 786.0, "text": "I'll share some tips for how to address those."}, {"start": 789.0, "text": "The first pattern is skipping tests."}, {"start": 793.0, "text": "In XCTest, you skip tests using the XCTSkip API."}, {"start": 798.0, "text": "To replace it with Swift Testing API, use Test.cancel."}, {"start": 804.0, "text": "If you're writing new tests in Swift Testing,"}, {"start": 806.0, "text": "Test.cancel will work there as well."}, {"start": 808.0, "text": "But, Swift Testing has traits,"}, {"start": 810.0, "text": "which are annotations you can attach to test functions and suites."}, {"start": 815.0, "text": "Move test enablement logic out of the test body"}, {"start": 818.0, "text": "with the enabled or disabled trait."}, {"start": 821.0, "text": "Another common pattern is halting on failure."}, {"start": 825.0, "text": "In XCTest,"}, {"start": 826.0, "text": "you assign the continueAfterFailure property to false."}, {"start": 830.0, "text": "This halts tests on their first failed assertion."}, {"start": 834.0, "text": "To replace with Swift Testing API, use the #require macro."}, {"start": 839.0, "text": "It throws an error upon failure, halting the test,"}, {"start": 842.0, "text": "and you don't need to set continueAfterFailure anymore."}, {"start": 846.0, "text": "With Swift Testing,"}, {"start": 848.0, "text": "you also get to choose which expectations halt the test and which don't."}, {"start": 853.0, "text": "For more information,"}, {"start": 854.0, "text": "check out \"Migrating a test from XCTest\" in the developer documentation."}, {"start": 859.0, "text": "It covers many more scenarios"}, {"start": 861.0, "text": "and will be a great reference in your migration journey."}, {"start": 865.0, "text": "Xcode's Coding Assistant is also aware of this documentation."}, {"start": 869.0, "text": "It can help formulate a migration strategy or review your work."}, {"start": 874.0, "text": "It even has a skill to automate parts of your migration."}, {"start": 877.0, "text": "Wow, we covered a lot!"}, {"start": 880.0, "text": "So, in summary, here's how you can migrate fearlessly to Swift Testing."}, {"start": 886.0, "text": "Don't feel pressured to modify your XCTests until you're ready."}, {"start": 889.0, "text": "Focus on writing new tests using Swift Testing."}, {"start": 893.0, "text": "By relying on interoperability,"}, {"start": 895.0, "text": "you can even reuse your helper code which wraps XCTest API."}, {"start": 900.0, "text": "In the process, you'll turn up cross-framework issues from XCTest."}, {"start": 905.0, "text": "Interoperability allows you to replace XCTest API"}, {"start": 908.0, "text": "with Swift Testing API to address these,"}, {"start": 911.0, "text": "and Xcode 27 enables interoperability by default."}, {"start": 916.0, "text": "Make sure you handle all future cross-framework issues"}, {"start": 919.0, "text": "by upgrading to the complete or strict mode."}, {"start": 922.0, "text": "Now, it's time to turn the spotlight on Swift Testing."}, {"start": 928.0, "text": "After you migrate to Swift Testing,"}, {"start": 930.0, "text": "you get access to new tools to supercharge your tests."}, {"start": 934.0, "text": "Let's start with parameterized tests."}, {"start": 938.0, "text": "These are tests that repeat with different arguments."}, {"start": 942.0, "text": "Each argument becomes a separate test case."}, {"start": 946.0, "text": "All Swift Testing tests, including parameterized test cases,"}, {"start": 949.0, "text": "run in parallel by default."}, {"start": 951.0, "text": "This can be faster than running serially."}, {"start": 955.0, "text": "Check out this example."}, {"start": 957.0, "text": "I've migrated my project's bird test to Swift Testing."}, {"start": 961.0, "text": "This checks that every bird can flap its wings from forty to a hundred times."}, {"start": 966.0, "text": "I can't write a separate test for each of those combinations though,"}, {"start": 968.0, "text": "there's just too many of them."}, {"start": 970.0, "text": "In the body of my original XCTest,"}, {"start": 973.0, "text": "I used a nested loop to generate all the combinations."}, {"start": 977.0, "text": "I'll go ahead and run the test."}, {"start": 985.0, "text": "A few things stuck out to me."}, {"start": 987.0, "text": "The test took a while to finish, probably because there's lots of combinations."}, {"start": 992.0, "text": "Also, the test fails, but I don't even know which bird failed."}, {"start": 996.0, "text": "If I were still using XCTest,"}, {"start": 999.0, "text": "I'd have to catch these errors or run the test with a debugger attached."}, {"start": 1003.0, "text": "I have a better idea."}, {"start": 1004.0, "text": "Let's make this a parameterised test."}, {"start": 1007.0, "text": "I'll begin by removing these loops from the test body,"}, {"start": 1011.0, "text": "and instead, I'll define bird and count as test function parameters."}, {"start": 1020.0, "text": "I'll provide the input for birds and counts as arguments in the test macro."}, {"start": 1026.0, "text": "Swift Testing will pair each bird from the first argument"}, {"start": 1030.0, "text": "and each count from the second."}, {"start": 1032.0, "text": "I'll run the test again."}, {"start": 1036.0, "text": "Hey!"}, {"start": 1037.0, "text": "This time, the test finished almost instantly,"}, {"start": 1039.0, "text": "because Swift Testing ran all my combinations in parallel."}, {"start": 1043.0, "text": "In the Test navigator,"}, {"start": 1044.0, "text": "my parameterised test now has a disclosure arrow to its left."}, {"start": 1049.0, "text": "I'll click it to show all the combinations I'm testing."}, {"start": 1055.0, "text": "Wow, that's a lot of test cases."}, {"start": 1058.0, "text": "Ok, I still have to find the failing combinations."}, {"start": 1061.0, "text": "In the Test navigator, I'll filter the failing test results."}, {"start": 1066.0, "text": "Ah, there it is!"}, {"start": 1067.0, "text": "The swallow can't flap its wings less than 43 times."}, {"start": 1071.0, "text": "Using a parameterised test supercharged my test execution."}, {"start": 1076.0, "text": "Not only did I get results faster,"}, {"start": 1078.0, "text": "I could clearly tell which test inputs failed."}, {"start": 1082.0, "text": "Next, I want to show how to supercharge test coverage with exit tests."}, {"start": 1088.0, "text": "Note that exit tests are only supported on macOS, Linux, FreeBSD, and Windows."}, {"start": 1095.0, "text": "I'm looking for code that needs test coverage,"}, {"start": 1098.0, "text": "and I found something in my Bird initialiser."}, {"start": 1102.0, "text": "If I get an empty name for new Birds,"}, {"start": 1105.0, "text": "I halt the program with a precondition failure."}, {"start": 1108.0, "text": "I can verify if I've already tested this by going to the \"Editor\" menu"}, {"start": 1112.0, "text": "and showing \"Code Coverage.\""}, {"start": 1115.0, "text": "The coverage annotation shows the precondition in red,"}, {"start": 1118.0, "text": "which means that none of my tests run this code."}, {"start": 1121.0, "text": "An exit test is the perfect tool to add this coverage."}, {"start": 1126.0, "text": "You define an exit test with the #expect macro."}, {"start": 1130.0, "text": "Provide an expected process exit condition,"}, {"start": 1133.0, "text": "along with the body of the exit test."}, {"start": 1136.0, "text": "When you start the test,"}, {"start": 1137.0, "text": "Swift Testing runs the exit test body in a child process."}, {"start": 1142.0, "text": "Because that code is isolated,"}, {"start": 1144.0, "text": "it can crash without disrupting other tests."}, {"start": 1147.0, "text": "The exit test waits for the child process to finish"}, {"start": 1150.0, "text": "and checks the exit status to determine test success or failure."}, {"start": 1155.0, "text": "I can add a new test in this extension of my test suite."}, {"start": 1159.0, "text": "I'll use the #expect macro to create an exit test"}, {"start": 1162.0, "text": "and specify the process should exit with failure."}, {"start": 1167.0, "text": "Inside the body of the exit test, I'll create a Bird with an empty name."}, {"start": 1172.0, "text": "That should crash, but it'll be isolated,"}, {"start": 1174.0, "text": "because Swift Testing will run this code in a separate process."}, {"start": 1178.0, "text": "Now, I'll run all my tests."}, {"start": 1184.0, "text": "Great, my exit test passes!"}, {"start": 1186.0, "text": "Let's check the coverage one more time."}, {"start": 1189.0, "text": "I'll right click and select \"Jump to Definition\" on the Bird initializer."}, {"start": 1194.0, "text": "Now that we're back, let's examine the coverage again."}, {"start": 1197.0, "text": "The coverage annotation now highlights the precondition in green,"}, {"start": 1201.0, "text": "which means it's now tested!"}, {"start": 1204.0, "text": "That was a quick preview of two ways to supercharge your tests,"}, {"start": 1209.0, "text": "and if you have ideas for how Swift Testing can improve,"}, {"start": 1212.0, "text": "I encourage you to contribute!"}, {"start": 1214.0, "text": "That's because Swift Testing is open source."}, {"start": 1218.0, "text": "It's part of the SwiftLang organization on GitHub."}, {"start": 1221.0, "text": "It's available on more platforms than ever before,"}, {"start": 1225.0, "text": "with full support starting this year for FreeBSD."}, {"start": 1229.0, "text": "The Testing Workgroup governs the project"}, {"start": 1231.0, "text": "and runs regular meetings that any Swift community member can attend."}, {"start": 1236.0, "text": "New features are guided by Swift Evolution."}, {"start": 1239.0, "text": "In fact, interoperability was one of those!"}, {"start": 1243.0, "text": "Share your opinions and ideas by joining us on the Swift Forums."}, {"start": 1248.0, "text": "Now, it's your turn to make like a bird, and migrate to Swift Testing!"}, {"start": 1254.0, "text": "Interoperability in Xcode 27 makes this transition easier than ever."}, {"start": 1259.0, "text": "Try it out in your project and explore its different modes."}, {"start": 1262.0, "text": "Along the way, you can adopt powerful tools,"}, {"start": 1265.0, "text": "such as parameterized tests and exit tests."}, {"start": 1268.0, "text": "To, go further, check out \"Go further with Swift Testing\" from WWDC 2024."}, {"start": 1275.0, "text": "Have fun renovating your tests!"}]}