我正在为iOS应用程序设置测试套件。我正在使用Xcode的XCTest框架。这只是一个UI测试套件。现在我有一个测试目标有一个文件TestAppUITests。我的所有测试用例都驻留在这个文件中(第一个问题:我的所有测试用例都应该在这里,还是我需要更多的文件?)在这个文件中,我有一堆测试用例就好像是用户使用的一样应用程序。登录/创建帐户然后登录 - >浏览应用程序 - >检查是否加载了UI元素 - >添加其他安全性,如辅助电子邮件地址 - >注销。这些如何订购?
我到处研究过,在这里和那里发现了一些宝石,但仍有疑问。在测试目标中,您应该有多个文件吗?我只是在我的UITest目标中有一个。我的另一个重要问题是难以解释。每次我们从一开始就运行测试套件时,应用程序就会在您未登录的状态下启动,因此,例如,为了测试类似于在应用程序中导航的内容,我需要运行该测试以首先登录。现在我设置它以便登录测试运行一次,然后是其后的所有其他测试,然后以logout结束。但是,一个文件TestAppUITests变得非常长,有大量的测试用例。这是最佳做法吗?
洙。让我们把它分成更多的部分:
1 / Should all of my test cases be in here or do I need more files?
好吧 - 您的测试与任何其他应用程序代码相同。你有一个文件中的所有应用程序代码?可能不是,所以一个好的做法是将你的测试分成更多的类(我按照他们测试的方式进行 - LoginTests
类,UserProfileTests
类等等)。
为了更进一步 - 我将测试类和方法分成不同的文件 - f.e.我有一个方法,将在UI测试中进行登录,所以我在UITestCase+Login
扩展中有方法(UITestCase
是一个类,由所有这些UITestCase+Something
扩展扩展)并且我有测试,将在LoginTests
中进行登录我从UITestCase+Login
扩展中调用login方法。
但是 - 您不一定需要更多测试类 - 如果您决定将所有UI测试放在一个类中,那么这是您的选择。一切都会起作用,但是将这些测试在单独的文件中使用的测试和方法只是测试和方法未来开发的一个很好的实践。
2 / ... Add additional security like secondary email address... How should these be ordered?
将它们分配到方法中并在测试中调用它们。
当我使用无效的登录凭据时,这是我期待一些UI消息的方法:
func expectInvalidCredentialsErrorMessageAfterLoggingWithInvalidBIDCredentials() {
let alertText = app.alerts.staticTexts[localizedString("mobile.account.invalid_auth_credentials")]
let okButton = app.alerts.buttons[localizedString("common.ok")]
wait(
until: alertText.exists && okButton.existsAndHittable,
timeout: 15,
or: .fail(message: "Alert text/button are not visible.")
)
okButton.tap()
}
这是我在测试中使用它:
func testTryToLoginWitMissingBIDAndExpectError() {
let inputs = BIDLoginInputs(
BID: "",
email: "[email protected]",
departureIATA: "xxx",
dayOfDeparture: "xx",
monthOfDeparture: "xxx",
yearOfDeparture: "xxx"
)
loginWithBIDFromProfile(inputs: inputs)
expectInvalidCredentialsErrorMessageAfterLoggingWithInvalidBIDCredentials()
}
您可以看到,测试非常易读,而且它们(几乎完全)由方法组成,这些方法可在更多测试中重复使用。
3 / Within the test target, should you have multiple files?
再次 - 这取决于你,但是在一个文件中包含所有内容对于维护和这些测试的未来开发并不是很好。
4 / ... Each time we run the test suite from the beginning the app starts in a state where you are not logged in...Right now I have it setup so that the login test runs once, then all other tests after it, then ends with logout...
不是一个好的方法(在我看来很简单的观点) - 将功能放入方法中(是的,我在这里重复:-))并将测试用例分成更多的文件(理想情况是它们的功能性质,“他们做什么”)。
希望,这对你有帮助,当我开始使用iOS UI测试时,我也遇到了同样的问题。哦。顺便说一下 - 我在media.com上关于XCTest的iOS UI测试的高级策略和方法的文章将在几天内发布,我可以在它出来之后给它一个链接 - 这应该会帮助你更进一步。
与this answer相呼应,将复杂应用程序的所有测试存储在单个文件中是违反最佳实践的,并且您的测试应该是结构化的,以便它们彼此独立,只测试每个测试中的单个行为。
将所有内容拆分成许多测试似乎都是违反直觉的,这些测试需要在每次测试开始时重新启动应用程序,但这会使测试套件更可靠,更容易调试,因为测试中的未知数量通过更小,更短的测试来最小化。由于UI测试需要相对较长的时间才能运行,这可能令人沮丧,因此您应该尝试通过确保应用程序具有良好的单元/集成测试覆盖率来最小化所需的数量。
关于构建XCTest UI测试的最佳实践,您应该查看Screenplay或Page Object模型。页面对象模型已经存在很长时间了,虽然许多帖子都倾向于关注Selenium或基于Java的测试框架,但它有很多帖子。我使用Swift和XCTest在Page Object model和Screenplay model上写过帖子,他们应该帮助你。