How to prevent app quit automatically after UI Test in Xcode? - ios

I want to let the UI Test automatically lead me to some parts of my app, and then I will go with some manual testing. However, the app just quit automatically after the UI Test is done. Are there any ways to prevent this and achieve my goal?

For a UI test you can simply set a breakpoint at the end of the test. Once the breakpoint is hit you can go ahead and use the debug application.

Related

UI Tests iOS and async build of UI

I'm trying to write UI test in my iOS project. The main view is built after an API call response, so when i try to test it with a UI test, after the XCUIApplication.launch(), if check existence of a UI element, test fails, maybe because the element is not already present in the view, but if i add a breakpoint before the test check, test stop correctly with a success, there's a way to test this kind of behavior?

Print statement is not working in view controller method when run the UI Test case in Xcode 14.0

I have created a custom framework and inside that all the logs are recorded when we initialise the framework.
Now I have integrate that framework inside a demo project and write UI test case for the same.
When I add the breakpoint inside the method then only logs are getting printed in the console while running the UI test case .Otherwise it don't print the logs in the console when break point is not added.
I don't know why thing is happening. I need logs for analysis purpose.
Could you please help me .
Print statement is only working when adding break point in the view controller class.
![2]
Your UI test code runs in a separate process outside of your app process. The default state shows the debugger for the UI test process, and not your app process, and will only show print statements written in the UI test code. The print statement you wrote seems like it’s a part of your app code.
If you hit a breakpoint in your app code, the Xcode console switches to show the debugger for your app, as opposed to the debugger for your UI test, which is why you see the print statement there.

UI Tests Pass Manually, Fail When Ran Automatically

I am trying to run my UI Tests all at once. All the tests work fine when I run them individually, but when I run them automatically all together the tests fail because Xcode does not update where it is at in the app to successfully run the other tests.
So just to clarify, my first test is the signUpTest, so I'll run that test and it will work and then it will go to the second test which is the signUpMyInfo test. My issue is that this second test will only run once the app has moved to the second view controller, which is where the first unit test ends, however when the second test begins for some reason Xcode throws the app back to the first view controller, causing the second test to fail.
In short, I am unclear why the app returns to the first view controller after the first test successfully passes rather than remaining on the second view controller and running the second test from there.
Also worth noting, that this problem does not always happen, Xcode does sometime successfully throw me to the next view controller where the second test passes fine, but this problem is happening enough that I have to bother someone on stack to help me solve it :p
At the end of each test Xcode runs, it will close the app, and you'll need to launch the app again at the beginning of each test. This is to encourage test independence, which allows each test to stand alone, so that you know that if a test fails, it fails because of something that test did, not as a result of something another test did. This makes test failures easier to diagnose and makes your test results more informative and accurate.
You will need to add code in your second test to move from the first view controller to the second. This may seem like duplication at first glance, but as explained above, this is for the greater good of your test suite.

UIAutomation bringing iOS app to a consistent state

I writing JavaScript test for my iOS app. I am hoping of using Apples Profiler and UIAutomation.
1) I was wondering how can I reset the app every time I run the test. I would like to reset my app to a consistent state every time before I run a new test. Have separated my tests into few groups. Every test of the first group should start on the first screen containing a tableView and filters for sorting elements in that table should be set to a consistent state. Second group of tests should start on the Settings screen and some options/switches should be pressed in particular order for me to test the UI.
2) Also first time the app starts there is a tutorial. How can I make the app think it is freshly installed and test the tutorial feature.
Thanks for the answers
How can I make the app think it is freshly installed ?
As the iOS applications are sandboxed, the only way is to delete and re-install the app every time.
In the Illuminator framework that I wrote (which extends UIAutomation), we provide an automation bridge that allows us to send "reset" commands to the app, putting it into a known state before each test is run. This makes the testing very repeatable, even if some tests fail.
Additionally, the command line scripts can recover the test run even if the app crashes.

IOS testing: Test interaction between two apps

I need to automate a test on an IOS app using UI automation.
I need to test the following scenario.
1) open the mail app and select a file to share. This will open my app
2) Now I need to perform UI actions on my app and do some tests
I can't figure out how do automate this scenario using Instruments or Appium. All these tools take bundle name of one app. I need a way to control and perform UI actions on two app from a single script.
Any suggestions?
Edit: For clarification
This is not possible within one session
The solution is to split up your tests to encompass one or more webdriver sessions.
Part One:
desired_caps['app'] = 'sampleApp1'
driver = webdriver.new('http://0.0.0.0/wd/hub:4732', desired_caps)
// Do what you need to do.
driver.quit()
Part Two:
desired_caps['app'] = 'sampleApp2'
driver = webdriver.new('http://0.0.0.0/wd/hub:4732', desired_caps)
// Do what you need to do.
driver.quit()

Resources