panther
panther copied to clipboard
How to change the environment the website runs in?
When working with panther tests, the website seems to be running with dev
mode config, even though if I dd(getenv('APP_ENV'))
it reports it's in 'test' environment. This causes lots of problems when testing because of the web profiler toolbar overlay preventing buttons from being clicked.
The toolbar is disabled for the test env per the config, and the only way to prevent the toolbar from showing is by editing the config/dev/web_profiler
and set toolbar:false
. Something I shouldn't have to do as I'm in the test environment
Why is this crazy behaviour happening?
Agreed, that would be nice to change the environment.
One of my usage case is to disable translations in test
env, so we can check translations keys instead of translated strings.
I have exactly the same issue ; no matter how I try to set the env, it always use dev.
I tried to set it in :
- .env file
- phpunit xml file
- in the Dockerfile as env param
- in the docker command line when running the test
i don't use panther now (I didn't like how it squeezes selenium / web driver into an unsuitable interface), but I think the solution would be to modify the code to not use the php server for its requests, but your actual server e.g. nginx / apache
I noticed that during the tests the server runs with -t public option and when we launch it manually it has vendor/symfony/web-server-bundle/Resources/router.php (without -t) provided we have the web server bundle.
I could make it work by :
- forcing the argument to vendor/symfony/web-server-bundle/Resources/router.php in vendor/symfony/panther/src/ProcessManager/WebServerManager.php
- Adding a $_SERVER = array_merge($_SERVER, $_ENV); before the return is made in vendor/symfony/web-server-bundle/Resources/router.php
After that the APP_ENV environment var is correctly used
I'm having struggles too because on my app, web test case is using the env vars from the phpunit.xml.dist
, but Panther test have a different configuration and I need an additional env.
For this, I just change APP_ENV
from test
to panther
in the test case by overriding setUpBeforeClass()
and tearDownAfterClass()
methods.
But, what I see is that the env, even if it's overriden, it is not correctly populated in the PHP web server.
When I dump($_SERVER, $_ENV);
in public/index.php
, I see that $_ENV['APP_ENV']
exists, but *not $_SERVER['APP_ENV']
, so it will still load the .env
file, which is not what I need at all.
I think we definitely need a proper way to retrieve env vars in our projects instead of relying on $_SERVER
all the time...
Hello, have you since found a way to launch Panther with the Test environment? I have the same problem
@bastien70 There's one specific thing about using the test
environment that is not the best option: session. Since Panther uses a web browser, you can't use Session, since it's mocked as an array in the memory, therefore the session is lost after every request.
The solution I had was to create a custom panther
environment, create a services_panther.yaml
in which I imported everything from the config/dev/
files and overrode the session parameters to use a native session handler instead of the mocked one.
Then, I made sure that every Panther test case use the panther
environment name, and that's it.
@bastien70 There's one specific thing about using the
test
environment that is not the best option: session. Since Panther uses a web browser, you can't use Session, since it's mocked as an array in the memory, therefore the session is lost after every request.The solution I had was to create a custom
panther
environment, create aservices_panther.yaml
in which I imported everything from theconfig/dev/
files and overrode the session parameters to use a native session handler instead of the mocked one.Then, I made sure that every Panther test case use the
panther
environment name, and that's it.
Wow, I'm quite interested! Could you share an example of the code you use to do all of this? That interests me a lot
Hmm, it's on a private project, I can't share it now, I would need to create a reproducer somewhere, I'll look into it when I have time to focus on this subject 😉
Hmm, it's on a private project, I can't share it now, I would need to create a reproducer somewhere, I'll look into it when I have time to focus on this subject 😉
Okay good ! I can not wait to see it !
Tiny bit of information though @bastien70 : are you using Panther inside a Docker container?
Not at all @Pierstoval . To be honest, I am new to Symfony. I have never used Docker.
Right now all I can do with Panther is log a user by going to the login page and submitting the authentication information to be able to initiate the user's session. However, as said above, it relies on data in the dev environment which is problematic.
@bastien70
Then, I made sure that every Panther test case use the panther environment name, and that's it. Can you please explain how to to this?
Can you please explain how to to this?
By creating a new environment, it can be pretty quick if you follow the official docs about creating new environments
@Pierstoval Thanks