symfony / panther

A browser testing and web crawling library for PHP and Symfony
MIT License
2.94k stars 221 forks source link

How to change the environment the website runs in? #68

Open ChangePlaces opened 6 years ago

ChangePlaces commented 6 years ago

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?

Kocal commented 6 years ago

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.

pierre-moire commented 6 years ago

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 :

ChangePlaces commented 6 years ago

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

pierre-moire commented 6 years ago

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 :

image

image

After that the APP_ENV environment var is correctly used

Pierstoval commented 6 years ago

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...

bastien70 commented 4 years ago

Hello, have you since found a way to launch Panther with the Test environment? I have the same problem

Pierstoval commented 4 years ago

@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 commented 4 years ago

@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.

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

Pierstoval commented 4 years ago

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 😉

bastien70 commented 4 years ago

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 !

Pierstoval commented 4 years ago

Tiny bit of information though @bastien70 : are you using Panther inside a Docker container?

bastien70 commented 4 years ago

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.

Chris53897 commented 2 years ago

@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?

Pierstoval commented 2 years ago

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

Chris53897 commented 2 years ago

@Pierstoval Thanks