Behat is a BDD framework for PHP to help you test business expectations.

Overview

Behat

Behat is a BDD framework for PHP to help you test business expectations.

Gitter chat License Unix Status Windows status Scrutinizer Quality Score

Installing Behat

The easiest way to install Behat is by using Composer:

$> composer require --dev behat/behat

After that you'll be able to run Behat via:

$> vendor/bin/behat

Installing Development Version

Clone the repository and install dependencies via Composer:

$> composer install

After that you will be able to run development version of Behat via:

$> bin/behat

Contributing

Before contributing to Behat, please take a look at the CONTRIBUTING.md document.

Versioning

Starting from v3.0.0, Behat is following Semantic Versioning v2.0.0. This basically means that if all you do is implement interfaces (like this one) and use service constants (like this one), you would not have any backwards compatibility issues with Behat up until v4.0.0 (or later major) is released. Exception could be an extremely rare case where BC break is introduced as a measure to fix a serious issue.

You can read detailed guidance on what BC means in Symfony2 BC guide.

Useful Links

Contributors

Issues
  • The last jUnit formatter PR?

    The last jUnit formatter PR?

    This replaces #618 I think we're very close to completion (thanks to the amazing work by @james75 )

    Remaining questions

    • https://github.com/Behat/Behat/pull/618#discussion_r22332553 (not sure if anything is needed there)
    • https://github.com/Behat/Behat/pull/618#discussion_r22332177
    opened by wouterj 61
  • Does Behat generate Code Coverage?

    Does Behat generate Code Coverage?

    Hi i asking sorry in case I didnt see the options that enable this feature. I case its not my mistake can behat show codecoverage, in clover format? Is there a way to integrate behat with phpunit?

    Thank you. And have a nice day.

    opened by fabiofabbrucci 60
  • Reimplement the HTML formatter for 3.0

    Reimplement the HTML formatter for 3.0

    Behat 3.0-RC1 does not have the HTML formatter anymore.

    The new implementation needs to take into account the issues reported bout the 2.5 HtmlFormatter

    Feature 
    opened by stof 55
  • 3.4.0 breaks the ability to run individual tests

    3.4.0 breaks the ability to run individual tests

    Update + quick fix

    This is a long standing issue which is affecting many users. It has been solved but the PR is not yet accepted. If you are affected by this you can solve it by adding the following lines to your composer.json:

    "require-dev": {
        "behat/gherkin": "^4.6.0",
        "cweagans/composer-patches": "^1.6.7",
    },
    "patches": {
        "behat/gherkin": {
            "Correctly filter features, now that the base path is correctly set": "https://github.com/Behat/Gherkin/compare/v4.6.0...a7d84eb6ba245ea268a304312d14660788bf6c29.patch"
        }
    }
    

    Note that this problem is not caused directly by Behat but it is due to a confusion between absolute and relative paths in the Behat/Gherkin library. We are keeping this issue open in the Behat queue so that it is easier to find for people who encounter this problem when using Behat.

    If possible please vote for + review + approve the fix at https://github.com/Behat/Gherkin/pull/129 - hopefully once it is approved it can be merged.

    Original summary

    This was originally reported at https://github.com/Behat/Gherkin/issues/128 but it appears to be a bug in Behat and not in Gherkin.

    In https://github.com/Behat/Behat/pull/1056 a change was introduced to make it possible to run individual tests from inside a different folder than where the tests are located. Unfortunately this breaks the more common use case of running the tests from inside the actual folder where they are located.

    To replicate this, create a folder structure in which the tests are located in a subfolder of the root of the project, e.g in the tests/ folder:

    $ composer require behat/behat-3.4.0
    $ mkdir tests && cd tests/
    $ ../vendor/bin/behat --init
    # Create a test
    $ vim features/homepage.feature
    # Make sure the gherkin cache is cleared, this might "hide" the problem
    $ rm -rf /tmp/behat_*
    # Try to run a single test
    $ ../vendor/bin/behat features/homepage.feature -vvv
    

    Result:

    $ ../vendor/bin/behat features/homepage.feature -vvv
    
    
    No scenarios
    No steps
    0m0.73s (9.22Mb)
    
                                                                                                                                                
      [Behat\Testwork\Tester\Exception\WrongPathsException]                                                                                     
      No specifications found at path(s) `features/homepage.feature`. This might be because of incorrect paths configuration in your `suites`.  
                                                                                                                                                
    
    Exception trace:
     () at /home/pieter/v/joinup-dev/vendor/behat/behat/src/Behat/Testwork/Tester/Cli/ExerciseController.php:111
     Behat\Testwork\Tester\Cli\ExerciseController->execute() at /home/pieter/v/joinup-dev/vendor/behat/behat/src/Behat/Testwork/Cli/Command.php:63
     Behat\Testwork\Cli\Command->execute() at /home/pieter/v/joinup-dev/vendor/symfony/console/Command/Command.php:264
     Symfony\Component\Console\Command\Command->run() at /home/pieter/v/joinup-dev/vendor/symfony/console/Application.php:841
     Symfony\Component\Console\Application->doRunCommand() at /home/pieter/v/joinup-dev/vendor/symfony/console/Application.php:206
     Symfony\Component\Console\Application->doRun() at /home/pieter/v/joinup-dev/vendor/behat/behat/src/Behat/Testwork/Cli/Application.php:124
     Behat\Testwork\Cli\Application->doRun() at /home/pieter/v/joinup-dev/vendor/symfony/console/Application.php:125
     Symfony\Component\Console\Application->run() at /home/pieter/v/joinup-dev/vendor/behat/behat/bin/behat:34
    

    Using git bisect I have pinpointed the introduction of this bug to https://github.com/Behat/Behat/commit/08802b7f2d736b88df339e5411a1c722e92adbe3

    Bug 
    opened by pfrenssen 50
  • v3.0.0RC1

    v3.0.0RC1

    Landed

    Happy new year, everyone! Before I go into long discussion about what’s new, here’s the link to compiled phar version for your enjoyment:

    link.

    So here it is, Behat v3. This is actually a RC1 version if @stof merges it. In two words - it’s stable, it’s ready, but has some formatters missing (only pretty and progress are implemented at the moment).

    So lets talk about what’s new. First, lets pretend that previous betas never happened and that it was a bad software designer dream. I was unhappy with the out coming architecture - it was hard to read, follow and extend. That’s the primary reason why v3 wasn’t been released months ago. I took time to take the Behat codebase and apply all that knowledge I learned in last year thanks to people like @mathiasverraes.

    This new codebase represents all what good software design means to me and as a matter of fact, first behat version ever I’m 100% proud of (except maybe formatters code themselves :D ). It is truly layered, independent architecture which will solve our testing problems years ahead. No more huge rewrites, guys. Not because we wouldn’t want it, but because this new architecture allows us to gradually grown parts of Behat independently - either through core or third party extensions.

    So let’s get started with shiny new features?

    Testwork

    First stop is the Behat\Testwork. Testwork is an interesting, but totally unexpected side effect of this domain-driven redesign for Behat. You see, the way this last refactoring was going is separation of concerns and sharpening of Behat domain.

    If somebody didn’t know, Behat domain is a “testing tool” :) So somewhere at later stages of redesign I noticed that there are some parts of the codebase that has limited to inexistent knowledge about Gherkin or Behat itself - those were the pure domain services on their own. So this was more than natural to move all this common functionality out of Behat\Behat namespace. I ended up moving ~40% of Behat code out into Behat\Testwork.

    So what is this Testwork now? Testwork basically is a first ever meta-testing framework for php. It is a framework for building testing frameworks. Think about it - every time somebody wants to start his own testing framework he needs to solve all the same common problems again and again - services management, configuration, extension system, suite management, environment management and isolation, subject loading, testing services, user input and testers output management with formatters. Recreating all those things again and again could be a really boring task (trust creator of two popular testing frameworks) because it’s routine.

    You don’t want to spend time on boiler plating those same services again and again - it’s a waste of time. You want to focus on things that matter most and things that differentiate your framework from others. That’s where Behat\Testwork gives you a hand. It provides you with a foundation and set of services that cover all aspects of a testing tool development:

    • ServiceContainer providing configuration loading and extension mechanisms for your framework
    • Call management with exception catching and output buffering
    • Cli management using CLI controllers
    • Environment management using environment handlers and isolators
    • Exception handling services
    • Hook management allowing you to provide hooking mechanisms in your framework
    • Output management using different formatters. Testwork even provides you with base formatter classes that have everything you need.
    • Subject loading tools
    • Suite management utils
    • Tester services themselves

    All those things are implemented as extensions on top of the really-really slim core (ServiceContainer + Cli packages). It basically means two things - almost everything in Testwork is extension and all extensions could provide their own extension points. Those extension points of core extensions are used by Behat set of extensions on top of Testwork.

    Testwork extension system have some really awesome, but completely unplanned implications:

    1. Behat itself from now is is just a core set of Testwork extensions
    2. From now on you can not only extend the Behat, but the foundation it was built on (Testwork)
    3. Every testing framework that’ll use Testwork as its foundation will have full support for all Testwork extensions. It’s like Rack or Stack, but for testing frameworks

    Lets stop on point #3 for a second. What it means is that when parallel runner extension will land to Behat v3.1 it will be a Testwork extension. So all other testing frameworks (phpspec3?, phpunit3?, codeception2?) built on top of Testwork will have parallel running functionality absolutely for free.

    As of its future plans, Testwork currently lives inside Behat repository. There are couple of good reasons for that:

    1. There could be some early design flaws (small ones if some) that I want to iron out before splitting both projects
    2. As Testwork was pretty much unplanned child, it does not have its own tests for now and solely depends on Behat test suite

    Plan is for Behat v3.1 to extract Testwork into separate repository with its own suite of tests and contributors. For now, you can use it as a dependency by requesting behat/behat: ~3.0.

    Behat\Testwork will hopefully open new era for testing frameworks in php. Same way as Behat and PhpSpec did. And I’m pretty much looking forward to what you guys can do with it. Documentation is coming, but for now, you can simply read the src/Behat/Testwork codebase. I hope I did a good job to make it readable and understandable.

    New Behat user land features

    Now we can stop talking about architecture with design and shift our focus to something you’ll see in your day-to-day Behat-user life - shiny new Behat features. As a matter of fact, there are plenty of them in v3. Let me show you the bigger ones.

    Multi-suite architecture

    This is a big one. In v3 nor your contexts nor your features are first-class citizens of your test suite, suites are. Each behat exercise (single execution) could have one or more suites associated with it. And each suite could have one or more contexts and features associated with it. It means not only you could have multiple contexts in one suite - you could test same features against different context classes in one run. Here's how it looks like in reality: http://youtu.be/8RqFzqj79iY

    Standard output buffering

    Remember those nasty times when you needed to debug some step, you tried to echo something from it and it messed your entire output, confusing you even more? Well, happy to report that these times are gone. From now on, Behat captures all output your steps produce and delegates its printing to output formatters. And be sure that formatters do damn good job of printing them cleanly in the context of a step under question. Just try to echo anything in one of your test steps and run behat.phar I provided above ;)

    Hooks as first class citizens

    In prior versions of Behat, hooks were merely a way to execute something before of after something happens in the framework. The problem was that they never were a first class citizen. There was no clear exception handling and failing BeforeScenario hook still didn’t prevent this scenario from running. Welp, no more. From now on, every @Before… hook have an impact on the testers and if your @BeforeStep fails, it means you can’t reliably test your step, thus it will be automatically marked as failed.

    But what about debugging? Same output buffering and exception handling rules apply to hooks too. And pretty formatter does damn good job of presenting your hooks output or exceptions in a most readable and clean way. Just give it a shot - define @BeforeScenario in your test context and enjoy the awesomeness :)

    Tell - don’t ask snippets

    We all know how awesome and impressive —append-snippets option is (if you don’t - go read behat -h). But more often than not we have more than one context class and want to add snippets to specific one instead of the main FeatureContext. That’s the primary reason —append-to was added, but it is clunky and unnatural to enter your context class every time. From now on, Behat will generate and append snippets only to contexts implementing one of those interfaces:

    • Behat\Behat\Context\TurnipAcceptingContext
    • Behat\Behat\Context\RegexAcceptingContext

    Every other context class will be ignored. It basically means that from now on, you need to tell once which context accepts snippets instead of telling to which context put them every time. You can even create convention in your team that you don’t commit contexts implementing those interfaces, meaning that every team member could have his own context implementing them.

    Turnip as a default step pattern language

    We all know that nobody can beat flexibility of regexps. That's why they are still here in behat and will stay for versions ahead. But flexibility always comes at a cost - especially with regexps. Readability suffers a lot even when you define a simplest patterns. So that's why starting from 3.0, default behavior for your initial context would be to use Turnip-style snippets. Read more.

    New Pretty and Progress formatters

    Pretty and Progress formatters were reimplemented from ground up. And they are much cleaner and readable than ever before. For example, Pretty formatter now magically highlights outline row columns with different colours according to failure state. Keywords are highlighted and paths don’t have a tendency to take all available space. Just give them a try and I’m sure they’ll surprise you not once.

    Speed and memory footprint improvements

    New architecture doesn’t only mean better extensions or more features in the future. In some cases it actually means huge improvement on users day-to-day life. For example, new architecture of Behat v3 helped to eliminate all of the performance and memory issues of Behat v2. And oh my, there were some. I spent quite some time debugging Gherkin and finding crazy new ways to limit amount of undying references in the core. And the result is - incredible speed boost and memory footprint never been that low. As a matter of fact, I think if you ever had “not enough memory” exception - chances are really high you’ll not see them again.

    I’m so impressed with Behat speed and memory consumption now that both those stats are now included by default in core formatters (so you can be impressed too).

    Next steps

    @stof will review this PR and hopefully would be able to merge it without finding problems that I’ll need to fix before :) In the mean time, I’ll switch my focus back to Behat core extensions (Mink, Symfony2) and new behat.org website. It will give community couple of weeks to one month for test-driving this new version and maybe even contributing those missing formatters (html, junit, json) :)

    No more rewrites - because we really don’t need them anymore.

    With love, Happy new year, guys!

    opened by everzet 47
  • Formatter JUnit

    Formatter JUnit

    The work on this Junit formatter at https://github.com/Behat/Behat/pull/527 seems to have stalled. I have take what was done by WouterJ done a refactor on the xml creation and completed the work. I have also brought the base inline with master so it can be merged.

    Feature 
    opened by james75 46
  • Update dependencies to allow Symfony 5.x components

    Update dependencies to allow Symfony 5.x components

    Two days ago the lastest version of the Symfony framework was finally release, including a lot of new and interesting improvements.

    For that reason, at the Symfony Hackday we are doing an effort to have all libraries ready for Symfony 5.0.

    #SymfonyHackday

    opened by japicoder 39
  • compound steps

    compound steps

    I think it would be nice to have the possibility to express steps entirely constituted by other steps as suggested here (see tip 13): http://www.engineyard.com/blog/2009/15-expert-tips-for-using-cucumber/ There are cases for which I would prefer the "step decomposition" to occur in the description instead of in the implementation. Just for the sake of a better understandability for people who only read the description but not the implementation.

    opened by headrevision 36
  • [WIP] A new fresh start with the JUnit formatter

    [WIP] A new fresh start with the JUnit formatter

    The previous PR got a bit messy and now I need to rewrite the hole formatter, I thought it was simpler to just start a new branch + PR.

    This continues what was started in #378

    Feature 
    opened by wouterj 33
  • Impossible to modify scenarios in beforeFeature event

    Impossible to modify scenarios in beforeFeature event

    In a FeatureContext, if I create a "@beforeFeature" static method, i can't modify scenarios (add tag(s), by example) because in behat/src/Behat/Behat/Tester/FeatureTester.php file, scenarios was already get in a variable (line 75) and use later (line 80).

    I think, you should do something like that:

    if (count($feature->getScenarios())) {
        $this->dispatcher->dispatch(
            'beforeFeature', new FeatureEvent($feature, $this->parameters)
        );
    
        foreach ($feature->getScenarios() as $scenario) {
            ...
        }
    }
    
    opened by marmotz 33
  • Add support for psr/container 2.0, remove container-interop

    Add support for psr/container 2.0, remove container-interop

    This adds support for psr/container 2.0 (on top of 1.0, this is why the parameter types aren't introduced).

    Container-interop is abandoned since psr/container 1.0 and does not support 2.0. As users using container-interop have been warned about this for more than 2 years now while running composer install, I think it's safe to remove the integration of this package.

    opened by wouterj 0
  • Generate snippets with Attributes instead of Annotations

    Generate snippets with Attributes instead of Annotations

    Behat has full support for PHP 8 Attributes since version 3.10.0.

    For example, this means that instead of

    /**
     * @Given something
     */
    public function something() {}
    

    it is now possible to write

    #[Given('something')]
    public function something() {}
    

    and the same goes for When, Then and all hooks (BeforeScenario et al).

    However, when generating snippets1 Behat will use Annotations instead of Attributes.

    Behat should be able to generate snippets using Attributes instead of Annotions when applicable (ie on PHP >= 8). Note that when generating a snippet with an Attribute that Attribute should also be used in the class where it's added, otherwise it won't work.

    Since Behat supports PHP7.2+ at the time of writing it still needs to support generating snippets with Annotations, but it could default to Attributes when PHP >=8 is detected for example. This could also be an option, but I'm unsure if that is worth it. It feels like something that would be OK te enforce, since the entire ecosystem is moving away from Annotations to Attributes anyway. Curently features/snippets.feature tests for output with Annotations. Those scenarios could be run with a new tag @php7 similar to the already existing @php8 to prevent them from being checked on PHP8. And then the same scenarios but updated using attributes could be added with @php8 tags.

    1 A snippet can be generated when at the end of a run Behat has detected undefined steps. It can add a skeleton of the step to a feature context.

    opened by rpkamp 3
  • Release 3.10 download gives version 3.8.1 for --version

    Release 3.10 download gives version 3.8.1 for --version

    Release 3.10 download gives version 3.8.1 for "php ./behat.phar --version"

    wget https://github.com/Behat/Behat/releases/download/v3.10.0/behat.phar
    --2021-11-02 22:09:49--  https://github.com/Behat/Behat/releases/download/v3.10.0/behat.phar
    Resolving github.com (github.com)... 140.82.121.3
    Connecting to github.com (github.com)|140.82.121.3|:443... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: https://github-releases.githubusercontent.com/1367484/e0873b4e-ba85-4c0b-849b-74e49e5cef7b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20211102%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20211102T210950Z&X-Amz-Expires=300&X-Amz-Signature=86da702c662a6dec1364b3d711a02303abced3185f7762ca9fff315539a076b6&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=1367484&response-content-disposition=attachment%3B%20filename%3Dbehat.phar&response-content-type=application%2Foctet-stream [following]
    --2021-11-02 22:09:50--  https://github-releases.githubusercontent.com/1367484/e0873b4e-ba85-4c0b-849b-74e49e5cef7b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20211102%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20211102T210950Z&X-Amz-Expires=300&X-Amz-Signature=86da702c662a6dec1364b3d711a02303abced3185f7762ca9fff315539a076b6&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=1367484&response-content-disposition=attachment%3B%20filename%3Dbehat.phar&response-content-type=application%2Foctet-stream
    Resolving github-releases.githubusercontent.com (github-releases.githubusercontent.com)... 185.199.109.154, 185.199.108.154, 185.199.111.154, ...
    Connecting to github-releases.githubusercontent.com (github-releases.githubusercontent.com)|185.199.109.154|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 3163686 (3,0M) [application/octet-stream]
    Saving to: ‘behat.phar’
    
    behat.phar                                                                      100%[====================================================================================================================================================================================================>]   3,02M  7,03MB/s    in 0,4s    
    
    2021-11-02 22:09:50 (7,03 MB/s) - ‘behat.phar’ saved [3163686/3163686]
    
    php ./behat.phar --version
    behat 3.8.1
    
    opened by thomasbley 3
  • Replace %1% with %count% in bg,hu,ko translations

    Replace %1% with %count% in bg,hu,ko translations

    File ./i18n.php still contains %1% placeholders in translations, which is not used any more. It has to be replaced with %count%.

    • [ ] bg
    • [x] hu
    • [ ] ko
    opened by Sweetchuck 3
  • get elements by css when css contains multiple dashes found.">

    get elements by css when css contains multiple dashes "--classa class-b" throws: Expected identifier, but found.

    I'm using Behat Mink, "behat/behat": "^3.8", "behat/mink": "^1.8",

    the following css throws errors (this is particularly annoying for me, as dev are using many classes from highcharts that use dashes in classes)

    html: <span class="--da-shb"><span class="da-sh"><b>DashClass2</b></span></span>

    mink:

    $cssExpression = ".--da-shb .da-sh";
    $driver->getPage()->findAll('css', $cssExpression);
    
    

    throws error: Expected identifier, but <delimiter "-" at 1> found.

    work around:

    $cssExpression = '[class*="--da-shb"] [class*="da-sh"]';
    $driver->getPage()->findAll('css', $cssExpression);
    
    opened by botmike 2
  • Documentation for writing extensions

    Documentation for writing extensions

    Where can I find documentation for writing extensions for behat 2.5 AND 3+ ??? Can someone please help me?

    opened by juan-morales 0
  • Remove support for PHP 7.2 and 7.3

    Remove support for PHP 7.2 and 7.3

    PHP 7.2 is not maintained at all anymore and PHP 7.3's security support ends in 2 months.

    Maintenance 
    opened by pamil 6
  • Extension for --dry-run

    Extension for --dry-run

    Hi, There is a any possibilities to retrieve the tags associated to scenarios and features before actually starting the run? The --dry-run doesn`t retrieve the tags associated to the scenarios and features. The idea is: I want to get all the scenarios that has tag "test1" using a dray run and after that put that info in a list an start parallels run by calling the behat with the name of the feature or scenario. There is any behat command line combination to get an association between the tags and the scenarios/feature names or any other unique identifier ? There is something similar in specflow(C#) and behave(python). You run a --dry-run and you get all the infos.

    opened by cpintea 0
  • Idea to have @beforeWhen @beforeThen

    Idea to have @beforeWhen @beforeThen

    Well as you can guess from the title, this would introduce two new hooks that trigger before the first When and first Then in the scenario. This would give us much more options to clean up our code layer just beneath Gherkin.

    Here's a usecase about logging:

    Given there was a thing
    When I do a thing to the thing
    Then I want Mr. Logger to know that the thing happened. 
    // BTW don't be this stupid in real code ;) 
    

    Let's say the Given was a bit more complicated, and logging happened there as well, how would you distinguish between logs created during Given and logs created during Then? We only want to test for logs written during the When after all. This is something you could solve with a @beforeWhen. On execution of this hook, you could create a variable which would contain the max(logId) from your logs table. Then you would only test against logs which where created with a higher logId.

    Two more things:

    1. I know you can already do this by creating if statements in the @beforeScenario. This proposition just seems cleaner to me.
    2. We could also introduce a @beforeGiven as an alias of @beforeScnario. That fills the expectation of there being one, while not really cluttering anything.

    I'm willing to create a PR, I'm just curious whether you would like such a thing.

    opened by davidmaes 2
  • Skipping scenarios with multiple tags

    Skipping scenarios with multiple tags

    I've looked at this issue and this Stack Overflow question and it appears that these should work:

          filters:
            tags: "[email protected]&&[email protected]"
    

    fin behat features/admin.feature --tags '[email protected]&&[email protected]'

    yet neither work. Both of the above work if just one tag is used, such as tags: "[email protected]".

    This works, too: fin behat features/admin.feature --tags '[email protected]' --tags '[email protected]'

    In the issue above, @stof indicates that the following should work:

    ~test,test2: (NOT test) OR test2
    [email protected],[email protected]: (NOT test) OR (NOT test2) which is equivalent to NOT (test AND test2)
    [email protected]&&[email protected]: (NOT test) AND (NOT test2)
    

    So that the filter with two negated tags added the configuration file or on the CLI (as one pattern) is failing appears to be a bug.

    opened by aangelinsf 0
Releases(v3.10.0)
  • v3.10.0(Nov 2, 2021)

  • v3.9.1(Nov 2, 2021)

    What's Changed

    • Fix issue 1363 (Symfony 6 compatibility) by @dmaicher in https://github.com/Behat/Behat/pull/1368
    • update branch alias for dev-master by @dmaicher in https://github.com/Behat/Behat/pull/1369
    • Fix SYMFONY_REQUIRE for github action by @dmaicher in https://github.com/Behat/Behat/pull/1370
    • Issue #1373 - Replace %1% with %count% in hu translations by @Sweetchuck in https://github.com/Behat/Behat/pull/1374

    New Contributors

    • @dmaicher made their first contribution in https://github.com/Behat/Behat/pull/1368
    • @Sweetchuck made their first contribution in https://github.com/Behat/Behat/pull/1374

    Full Changelog: https://github.com/Behat/Behat/compare/v3.9.0...v3.9.1

    Source code(tar.gz)
    Source code(zip)
    behat.phar(3.01 MB)
  • v3.9.0(Oct 18, 2021)

    What's Changed

    • Fix syntax help test and bump gherkin dependency by @ciaranmcnulty in https://github.com/Behat/Behat/pull/1336
    • Remove legacy Symfony compatibility layers (#1305, #1347) by @simonhammes in https://github.com/Behat/Behat/pull/1349
    • Add PHP 8.1 support by @javer in https://github.com/Behat/Behat/pull/1355
    • Introduce reading PHP8 Attributes for Given, When and Then steps by @rpkamp in https://github.com/Behat/Behat/pull/1342
    • Allow Symfony 6 by @Kocal in https://github.com/Behat/Behat/pull/1346
    • Remove minimum-stability dev from composer.json & require Gherkin ^4.9.0 by @pamil in https://github.com/Behat/Behat/pull/1365
    • Allow to manually run GitHub Actions by @pamil in https://github.com/Behat/Behat/pull/1361
    • Add vimeo/psalm (#1307) by @simonhammes in https://github.com/Behat/Behat/pull/1348

    New Contributors

    • @simonhammes made their first contribution in https://github.com/Behat/Behat/pull/1349
    • @javer made their first contribution in https://github.com/Behat/Behat/pull/1355
    • @Kocal made their first contribution in https://github.com/Behat/Behat/pull/1346

    Full Changelog: https://github.com/Behat/Behat/compare/v3.8.1...v3.9.0

    Source code(tar.gz)
    Source code(zip)
    behat.phar(3.00 MB)
  • v3.8.1(Nov 7, 2020)

  • v3.8.0(Nov 1, 2020)

    Added

    Fixed

    Changed

    Source code(tar.gz)
    Source code(zip)
  • v3.7.0(Jun 3, 2020)

  • v3.6.1(Feb 6, 2020)

  • 3.6.0(Feb 4, 2020)

    Added

    • #1256: Update dependencies to support Symfony 5.x
    • #1244: Hide internal steps from stack traces in very verbose mode

    Fixed

    • #1238: Don't run Junit output if ext-dom is not present (and suggest in composer)

    Changed

    • #1171: Remove symfony/class-loader dependency
    • #1170: Switch to PSR-4 autoloading
    • #1230: PHP 7.3 support
    • #1230: Suggest ext-dom for JUnit support
    Source code(tar.gz)
    Source code(zip)
  • v3.5.0(Aug 10, 2018)

    Added

    • #1144: Allow to use arrays as context parameters
    • #1081: Allow passing null as a named context parameter
    • #1083: Time attribute in JUnit output

    Changed

    • #1153: Cache pattern to regex transformations
    • #1155: Remove composer suggestions

    Fixed

    • Custom container must be public for symfony 4
    • #1160: Register CLI services as synthetic
    • #1163: Allow for new-style symfony serialisation
    • #1130: Fix quoteless definition arguments matching with unicode characters
    Source code(tar.gz)
    Source code(zip)
  • v3.4.3(Nov 27, 2017)

  • v3.4.1(Nov 20, 2017)

  • v3.4.2(Nov 20, 2017)

  • v3.4.0(Sep 10, 2017)

    Added

    • #1071: Services auto-wiring
    • #1054: PSR-11 support for helper containers.
    • Support for modern PHPUnit.

    Fixed

    • #1056: Make Gherkin aware of the base path so it can filter correctly

    Changed

    • #1069: Rework argument validators

    Deprecated

    • #1054: Deprecated usage of Interop\Container. Versions prior to 1.2 are not supported, but 1.2 is a non-breaking change. If you depend heavily on Interop, upgrade to 1.2, which is still supported by helper containers. Aim to migrate to Psr before Behat 4.0 shows up on horizon
    • PHP versions prior to 5.6 and HHVM were dropped from CI build matrix. It doesn't mean that we'll start using features of 5.6 yet, it just means we don't get out of our way to support 5.3 and 5.4 anymore. In 4.0 support will be completely dropped.
    Source code(tar.gz)
    Source code(zip)
  • v3.3.1(May 15, 2017)

    Added

    • #976: Add tests to check that snippets treat words containing apostrophes as a single word

    Fixed

    • #993 Fix mixed arguments organizer not marking typehinted arguments as "defined"
    • #992 Do not misinterpret first argument as a numbered argument if it is in fact typehinted
    • #1028 Parent / Child class argument ambiguity issue with MixedArgumentResolver
    Source code(tar.gz)
    Source code(zip)
  • v3.3.0(Dec 25, 2016)

  • v3.2.3(Dec 25, 2016)

  • v3.2.2(Nov 5, 2016)

  • v3.2.1(Sep 25, 2016)

  • v3.2.0(Sep 20, 2016)

    Added

    • #910: Return type based transformations
    • #903: Multiline step definitions support
    • #930: Whole table transformation
    • #935: Narrative filters in suites
    • #936: Debug command
    • #931: Exception handlers extension point
    • #870: Added build-related files and folders to .gitattributes
    • #946: Official full Windows support with CI (AppVeyor) on every build

    Changed

    • #922: Snippets generation revamp
    • #920: More context for pending/failed steps with progress formatter
    • #905: Transformations refactoring
    • #864: Use only one autoloader if possible
    • #920: Improve "No specifications found" error message
    • Refactor changelog to follow Keep a Changelog
    • Refreshed CONTRIBUTING.md
    • Refreshed Scrutinizer config

    Fixed

    • #911: Fix context isolation for Scenario Outlines
    • #860: Include basepath in generateKey
    • #857: Only cache failed scenario's for rerun
    • #933: Save failed runs with suite information
    • #833: Properly handle interupts on PHP7
    • #904: Provide clearer exception message when long token names used
    • #941: Transformation should be allowed if printable chars are used

    Deprecated

    • #922: *SnippetAcceptingContext interfaces
    • #905: RuntimeTransformation
    • #905: Transformation::getPattern
    • #920: StepStat

    Removed

    • Remove behat.bat (by Konstantin Kudryashov)
    Source code(tar.gz)
    Source code(zip)
    behat.phar(2.05 MB)
    behat.phar.asc(801 bytes)
  • v3.2.0rc2(Sep 10, 2016)

  • v3.2.0rc1(Sep 2, 2016)

    Added

    • Return type based transformations (PR #910)
    • Multiline step definitions support (PR #903)
    • Whole table transformation (PR #930)
    • Narrative filters in suites (PR #935)
    • Debug command (PR #936))
    • Exception handlers extension point (PR #931)
    • Added build-related files and folders to .gitattributes (by Filippo Tessarotto)

    Changed

    • Snippets generation revamp (PR #922)
    • More context for pending/failed steps with progress formatter (PR #920)
    • Transformations refactoring (PR #905)
    • Use only one autoloader if possible (by Warnar Boekkooi)
    • Improve "No specifications found" error message (by Konstantin Kudryashov)

    Fixed

    • Fix context isolation for Scenario Outlines (by Konstantin Kudryashov)
    • Include basepath in generateKey (by Rajesh Taneja)
    • Only cache failed scenario's for rerun (by Rajesh Taneja)
    • Save failed runs with suite information (by Rajesh Taneja)
    • Properly handle interupts on PHP7 (by Peter Mitchell)
    • Provide clearer exception message when long token names used (by Konstantin Kudryashov)

    Deprecated

    Removed

    • Remove behat.bat (by Konstantin Kudryashov)
    Source code(tar.gz)
    Source code(zip)
    behat.phar(2.04 MB)
    behat.phar.asc(801 bytes)
  • v3.1.0(Mar 28, 2016)

    • Add support for Symfony 3 (thanks @benji07)
    • Add ability to specify execution order of suite (thanks @ciaranmcnulty)
    • Add translated keywords in definition printer (thanks @WouterJ)
    • Add 'rowtable' transformations (thanks @PurpleBooth)
    • Add 'narrative' filters (thanks @WouterJ)
    • Add JUnit formatter (thanks @WouterJ and @james75)
    • Add Japanese translation (thanks @SNakano)
    • Add romanian translation for formatters (thanks @Chriton)
    • Add table row transformations (thanks @ciaranmcnulty)
    • Add support for negative numbers without surrounding quotes (thanks @ryancookdev)
    • Handle case when non-existent config file is used (thanks @watermanio)
    • Handle non-default error_reporting()
    • Handle PHP7 errors implementing Throwable
    • Fix autoloading from the global installation (thanks @sroze)
    • Fix scenario scope naming (thanks @Taluu)
    • Fix output buffering errors (thanks @tscheepers)
    • Fix xdebug maximum nesting level errors (thanks @WorkingDevel)
    • Fix weird edge case in GroupedSpecificationIterator
    • Allow --verbose flag at CLI (thanks @pfrenssen)
    • Allow hyphens in suite names (thanks @WouterJ)
    • Allow suite settings with null values to exist (thanks @docteurklein)
    • Improve "can not generate snippets" message
    • Improve performance of Turnip parsing (thanks @Sam-Burns)
    • Improve the snippet generation by auto-importing needed classes (thanks @stof)
    Source code(tar.gz)
    Source code(zip)
  • v3.1.0rc2(Feb 21, 2016)

    • Handle PHP7 errors implementing Throwable
    • Fix autoloading from the global installation (thanks @sroze)
    • Fix scenario scope naming (thanks @Taluu)
    Source code(tar.gz)
    Source code(zip)
  • v3.1.0rc1(Dec 30, 2015)

    • Add support for Symfony 3 (thanks @benji07)
    • Add ability to specify execution order of suite (thanks @ciaranmcnulty)
    • Add translated keywords in definition printer (thanks @WouterJ)
    • Add 'rowtable' transformations (thanks @PurpleBooth)
    • Add 'narrative' filters (thanks @WouterJ)
    • Add JUnit formatter (thanks @WouterJ and @james75)
    • Add Japanese translation (thanks @SNakano)
    • Add romanian translation for formatters (thanks @Chriton)
    • Add table row transformations (thanks @ciaranmcnulty)
    • Add support for negative numbers without surrounding quotes (thanks @ryancookdev)
    • Handle case when non-existent config file is used (thanks @watermanio)
    • Handle non-default error_reporting()
    • Fix output buffering errors (thanks @tscheepers)
    • Fix xdebug maximum nesting level errors (thanks @WorkingDevel)
    • Fix weird edge case in GroupedSpecificationIterator
    • Allow --verbose flag at CLI (thanks @pfrenssen)
    • Allow hyphens in suite names (thanks @WouterJ)
    • Allow suite settings with null values to exist (thanks @docteurklein)
    • Improve "can not generate snippets" message
    • Improve performance of Turnip parsing (thanks @Sam-Burns)
    • Improve the snippet generation by auto-importing needed classes (thanks @stof)
    Source code(tar.gz)
    Source code(zip)
  • v2.5.5(Jun 1, 2015)

  • v3.0.15(Feb 22, 2015)

  • v2.5.4(Jan 23, 2015)

  • v3.0.14(Sep 23, 2014)

  • v3.0.13(Aug 28, 2014)

    • Add support for typehinted parameters
    • Allow any whitespace characters at the end of context class
    • Fix scenario with decimal number following string in Turnip pattern
    • Fix scenario with empty string in step with Turnip pattern
    • Fix scenario where step has slashes in Turnip pattern
    Source code(tar.gz)
    Source code(zip)
    behat.phar(1.58 MB)
  • v3.0.12(Jul 17, 2014)

A easy way to install your basic yii projetc, we have encrypt database password in phpfile, my class with alot funtions to help you encrypt and decrypt and our swoole server install just run ./yii swoole/start and be happy!

Yii 2 Basic Project Template with swoole and Modules Yii 2 Basic Project Template is a skeleton Yii 2 application best for rapidly creating small proj

null 2 Nov 25, 2021
A system to help parents call their children inside the school when they are outside

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

null 1 Oct 28, 2021
Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs.

Slim Framework Slim is a PHP micro-framework that helps you quickly write simple yet powerful web applications and APIs. Installation It's recommended

Slim Framework 11.2k Jan 18, 2022
Simple PHP framework that helps you quickly understand and write simple APIs.

Lightweight-PHP-Framework-For-APIs. Simple PHP framework that helps you quickly understand and write simple APIs. Installation Use the package manager

Youssef Hajjari 20 Dec 13, 2021
Leaf is a PHP framework that helps you create clean, simple but powerful web apps and APIs quickly and easily.

Leaf is a PHP framework that helps you create clean, simple but powerful web apps and APIs quickly and easily. Leaf introduces a cleaner and much simpler structure to the PHP language while maintaining it's flexibility. With a simple structure and a shallow learning curve, it's an excellent way to rapidly build powerful and high performant web apps and APIs.

Leaf Framework 445 Jan 19, 2022
Simple PHP framework that helps you quickly understand and write simple APIs.

Lightweight PHP Framework For Web and APIs PHP framework that helps you write quickly simple but powerful web apps and APIs Installation Use the packa

Youssef Hajjari 20 Dec 13, 2021
Quite possibly the smallest MVC framework you'll ever use.

Swiftlet Swiftlet is quite possibly the smallest MVC framework you'll ever use. And it's swift. Licensed under the MIT license. Buzzword compliance ✔

Elbert Alias 430 Jul 7, 2021
An intelligent code generator for Laravel framework that will save you time

An intelligent code generator for Laravel framework that will save you time! This awesome tool will help you generate resources like views, controllers, routes, migrations, languages and/or form-requests! It is extremely flexible and customizable to cover many of the use cases. It is shipped with cross-browsers compatible template, along with a client-side validation to modernize your application.

CrestApps 555 Jan 1, 2022
CleverStyle Framework is simple, scalable, fast and secure full-stack PHP framework

CleverStyle Framework is simple, scalable, fast and secure full-stack PHP framework. It is free, Open Source and is distributed under Free Public Lice

Nazar Mokrynskyi 149 Aug 12, 2021
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

null 13 Nov 17, 2021
PHPR or PHP Array Framework is a framework highly dependent to an array structure.

this is new repository for php-framework Introduction PHPR or PHP Array Framework is a framework highly dependent to an array structure. PHPR Framewor

Agung Zon Blade 1 Dec 26, 2021
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

Rizky Alamsyah 13 Nov 17, 2021
Framework X is a simple and fast micro framework based on PHP

Framework X is a simple and fast micro framework based on PHP. I've created a simple CRUD application to understand how it works. I used twig and I created a custom middleware to handle PUT, DELETE methods.

Mahmut Bayri 2 Jan 19, 2022
Framework X – the simple and fast micro framework for building reactive web applications that run anywhere.

Framework X Framework X – the simple and fast micro framework for building reactive web applications that run anywhere. Quickstart Documentation Tests

Christian Lück 350 Jan 12, 2022
🍃Termwind allows you to build unique and beautiful PHP command-line applications, using the Tailwind CSS API

Termwind allows you to build unique and beautiful PHP command-line applications, using the Tailwind CSS API. In short, it's like Tailwind CSS, but for the PHP command-line applications.

Nuno Maduro 1.1k Jan 12, 2022
FuelPHP v1.x is a simple, flexible, community driven PHP 5.3+ framework, based on the best ideas of other frameworks, with a fresh start! FuelPHP is fully PHP 7 compatible.

FuelPHP Version: 1.8.2 Website Release Documentation Release API browser Development branch Documentation Development branch API browser Support Forum

Fuel 1.5k Jan 6, 2022
An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols. PHP>=5.3.

Workerman What is it Workerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. Wo

walkor 9.7k Jan 18, 2022
Fast php framework written in c, built in php extension

Yaf - Yet Another Framework PHP framework written in c and built as a PHP extension. Requirement PHP 7.0+ (master branch)) PHP 5.2+ (php5 branch) Inst

Xinchen Hui 4.5k Jan 12, 2022