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

Comments
  • 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
  • Sharing context between steps of a scenario

    Sharing context between steps of a scenario

    In order to simply and have more human-readable scenarios, it would be nice to ease sharing state between steps. This idea is already explored by the ScenarioStateBehatExtension extension but we can have a lot of benefits and an easier syntax by adding it to the core of Behat.

    Current situation

    As an example, the following scenario:

    Scenario: Add a token to a bucket
       Given there is a bucket named "ContinuousPipe"
       When I add a token "1234" in the bucket "ContinuousPipe"
    

    In the step definition, I can use a repository or just a property of the context to share the created Bucket object in this example:

        /**
         * @Given there is a bucket named :name
         */
        public function iCreateABucketNamed($name)
        {
            $this->bucketRepository->save(Bucket::named($name));
        }
    
        /**
         * When I add a token :token in the bucket :bucketName
         */
        public function iAddATokenInTheBucket($token, $bucketName)
        {
            $bucket = $this->bucketRepository->findByName($bucketName);
            $bucket->addToken($token);
        }
    

    In my point of view, the drawback here is to have to mention again the bucket name in the second step. An option would be to simply have a bucket property in the context but that requires every other step that wants to use this variable to have access to this property.

    Ideal situation

    Scenario: Add a token to a bucket
       Given there is a bucket named "ContinuousPipe"
       When I add a token "1234" to this bucket
    
        /**
         * @Given there is a bucket named :name
         */
        public function iCreateABucketNamed($name) : Bucket
        {
            return Bucket::named($name);
        }
    
        /**
         * @When I add a token :token to this bucket
         */
        public function iAddATokenToThisBucket(Bucket $bucket, $token)
        {
            $bucket->addToken($token);
        }
    

    The value returned by the previous steps (if any) is then able to be inject in the following steps. Such a feature allow for instance to have these 2 definitions in different context files without any problem, or even to have another step that create a bucket a completely different way without any change on the second step.

    I'm happy to send a PR before the 3.2.0 release if that makes sense to the community :)

    opened by sroze 30
  • 8.1 issues when running behat with Symfony 5 deprecation notice is being converted to a fatal

    8.1 issues when running behat with Symfony 5 deprecation notice is being converted to a fatal

    Using Symfony 5.4 and php 8.1

    For some reason behat is failing. This should only be a deprecation but its treated as a fatal error only when running behat on cli.

    PHP 8.1.13 (cli) (built: Dec 22 2022 14:52:37) (NTS)
    Copyright (c) The PHP Group
    Zend Engine v4.1.13, Copyright (c) Zend Technologies
        with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies```
    
    fatal error: During inheritance of JsonSerializable: Uncaught Behat\Testwork\Call\Exception\CallErrorException: 8192: Return type of Contentful\Delivery\SystemProperties\BaseSystemProperties::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/frankmckechnie/dev/gc-site/vendor/contentful/contentful/src/SystemProperties/BaseSystemProperties.php line 53 in /Users/frankmckechnie/dev/gc-site/vendor/behat/behat/src/Behat/Testwork/Call/Handler/RuntimeCallHandler.php:90
    
    
    Stack trace:
    #0 /Users/fm/dev/site/vendor/contentful/contentful/src/SystemProperties/BaseSystemProperties.php(19): Behat\Testwork\Call\Handler\RuntimeCallHandler->handleError(8192, 'Return type of ...', '/Users/fm...', 53)
    #1 /Users/fm/dev/site/vendor/composer/ClassLoader.php(122): include('/Users/fm...')
    #2 /Users/fm/dev/site/vendor/composer/ClassLoader.php(443): Composer\Autoload\ClassLoader::Composer\Autoload\{closure}('/Users/fm...')
    #3 /Users/fm/dev/site/vendor/contentful/contentful/src/SystemProperties/LocalizedResource.php(14): Composer\Autoload\ClassLoader->loadClass('Contentful\\Deli...')
    #4 /Users/fm/dev/site/vendor/composer/ClassLoader.php(122): include('/Users/fm...')
    #5 /Users/fm/dev/site/vendor/composer/ClassLoader.php(443): Composer\Autoload\ClassLoader::Composer\Autoload\{closure}('/Users/fm...')
    #6 /Users/fm/dev/site/vendor/contentful/contentful/src/SystemProperties/Asset.php(14): Composer\Autoload\ClassLoader->loadClass('Contentful\\Deli...')
    #7 /Users/fm/dev/site/vendor/composer/ClassLoader.php(122): include('/Users/fm...')
    #8 /Users/fm/dev/site/vendor/composer/ClassLoader.php(443): Composer\Autoload\ClassLoader::Composer\Autoload\{closure}('/Users/fm...')
    #9 [internal function]: Composer\Autoload\ClassLoader->loadClass('Contentful\\Deli...')
    #10 /Users/fm/dev/site/vendor/company/gc-contentful-extension/src/Entity/CmsResponse.php(164): unserialize('a:1:{i:0;O:33:"...')
    #11 /Users/fm/dev/site/vendor/company/gc-contentful-extension/src/Client/DeliveryClient.php(104): GcContentfulExtension\Entity\CmsResponse->getData()
    #12 /Users/fm/dev/site/vendor/company/gc-contentful-extension/src/Repository/Read/ContentfulRepository.php(47): GcContentfulExtension\Client\DeliveryClient->entries(Object(Contentful\Delivery\Query))
    #13 /Users/fm/dev/site/vendor/company/gc-contentful-extension/src/Repository/Read/ContentfulRepository.php(27): GcContentfulExtension\Repository\Read\ContentfulRepository->entries(Object(Contentful\Delivery\Query), false)
    #14 /Users/fm/dev/site/src/Repository/Read/Contentful/FuneralPlans/FuneralPlanRepository.php(25): GcContentfulExtension\Repository\Read\ContentfulRepository->entry(Object(Contentful\Delivery\Query), false)
    #15 /Users/fm/dev/site/src/Repository/Read/Contentful/FuneralPlans/FuneralPlanRepository.php(37): App\Repository\Read\Contentful\FuneralPlans\FuneralPlanRepository->getFuneralPlanByKey('select', false)
    #16 /Users/fm/dev/site/src/Provider/Purchase/PurchaseItemProvider.php(42): App\Repository\Read\Contentful\FuneralPlans\FuneralPlanRepository->getPurchaseJourneyPlanContentByKey('select', false)
    #17 /Users/fm/dev/site/src/Factory/Purchase/v2/PurchaseDocumentFactory.php(99): App\Provider\Purchase\PurchaseItemProvider->getItemsForNativePlan('select', false)
    #18 /Users/fm/dev/site/src/Factory/Purchase/v2/PurchaseDocumentFactory.php(58): App\Factory\Purchase\v2\PurchaseDocumentFactory->createDataBlock(Object(App\Entity\Purchase\Cart), false)
    #19 /Users/fm/dev/site/src/Controller/Api/PurchaseDocumentController.php(63): App\Factory\Purchase\v2\PurchaseDocumentFactory->createDocumentEventFromRequest(Object(Symfony\Component\HttpFoundation\Request), '886b516c-665b-4...')
    #20 /Users/fm/dev/site/tests/Behat/Site/ContainerPurchaseJourneyContext.php(285): App\Controller\Api\PurchaseDocumentController->retrieveDocument(Object(Symfony\Component\HttpFoundation\Request), '886b516c-665b-4...', 'download')
    #21 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Call/Handler/RuntimeCallHandler.php(110): App\Tests\Behat\Site\ContainerPurchaseJourneyContext->iChooseToActionTheDocument('download', 'demands-and-nee...')
    #22 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Call/Handler/RuntimeCallHandler.php(64): Behat\Testwork\Call\Handler\RuntimeCallHandler->executeCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
    #23 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Call/CallCenter.php(138): Behat\Testwork\Call\Handler\RuntimeCallHandler->handleCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
    #24 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Call/CallCenter.php(96): Behat\Testwork\Call\CallCenter->handleCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
    #25 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Tester/Runtime/RuntimeStepTester.php(125): Behat\Testwork\Call\CallCenter->makeCall(Object(Behat\Behat\Definition\Call\DefinitionCall))
    #26 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Tester/Runtime/RuntimeStepTester.php(73): Behat\Behat\Tester\Runtime\RuntimeStepTester->testDefinition(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), Object(Behat\Behat\Definition\SearchResult), false)
    #27 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Hook/Tester/HookableStepTester.php(74): Behat\Behat\Tester\Runtime\RuntimeStepTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), false)
    #28 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/EventDispatcher/Tester/EventDispatchingStepTester.php(76): Behat\Behat\Hook\Tester\HookableStepTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), false)
    #29 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Tester/StepContainerTester.php(59): Behat\Behat\EventDispatcher\Tester\EventDispatchingStepTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\StepNode), false)
    #30 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Tester/Runtime/RuntimeScenarioTester.php(76): Behat\Behat\Tester\StepContainerTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
    #31 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Hook/Tester/HookableScenarioTester.php(74): Behat\Behat\Tester\Runtime\RuntimeScenarioTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
    #32 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/EventDispatcher/Tester/EventDispatchingScenarioTester.php(106): Behat\Behat\Hook\Tester\HookableScenarioTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
    #33 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Tester/Runtime/IsolatingScenarioTester.php(69): Behat\Behat\EventDispatcher\Tester\EventDispatchingScenarioTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\InitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
    #34 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Tester/Runtime/RuntimeFeatureTester.php(84): Behat\Behat\Tester\Runtime\IsolatingScenarioTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\UninitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), Object(Behat\Gherkin\Node\ScenarioNode), false)
    #35 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/Hook/Tester/HookableFeatureTester.php(72): Behat\Behat\Tester\Runtime\RuntimeFeatureTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\UninitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), false)
    #36 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Behat/EventDispatcher/Tester/EventDispatchingFeatureTester.php(74): Behat\Behat\Hook\Tester\HookableFeatureTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\UninitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), false)
    #37 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Tester/Runtime/RuntimeSuiteTester.php(63): Behat\Behat\EventDispatcher\Tester\EventDispatchingFeatureTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\UninitializedSymfonyExtensionEnvironment), Object(Behat\Gherkin\Node\FeatureNode), false)
    #38 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Hook/Tester/HookableSuiteTester.php(73): Behat\Testwork\Tester\Runtime\RuntimeSuiteTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\UninitializedSymfonyExtensionEnvironment), Object(Behat\Testwork\Specification\GroupedSpecificationIterator), false)
    #39 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/EventDispatcher/Tester/EventDispatchingSuiteTester.php(75): Behat\Testwork\Hook\Tester\HookableSuiteTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\UninitializedSymfonyExtensionEnvironment), Object(Behat\Testwork\Specification\GroupedSpecificationIterator), false)
    #40 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Tester/Runtime/RuntimeExercise.php(71): Behat\Testwork\EventDispatcher\Tester\EventDispatchingSuiteTester->test(Object(FriendsOfBehat\SymfonyExtension\Context\Environment\UninitializedSymfonyExtensionEnvironment), Object(Behat\Testwork\Specification\GroupedSpecificationIterator), false)
    #41 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/EventDispatcher/Tester/EventDispatchingExercise.php(73): Behat\Testwork\Tester\Runtime\RuntimeExercise->test(Array, false)
    #42 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Ordering/OrderedExercise.php(80): Behat\Testwork\EventDispatcher\Tester\EventDispatchingExercise->test(Array, false)
    #43 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Tester/Cli/ExerciseController.php(149): Behat\Testwork\Ordering\OrderedExercise->test(Array, false)
    #44 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Tester/Cli/ExerciseController.php(108): Behat\Testwork\Tester\Cli\ExerciseController->testSpecifications(Object(Symfony\Component\Console\Input\ArgvInput), Array)
    #45 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Cli/Command.php(63): Behat\Testwork\Tester\Cli\ExerciseController->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    #46 /Users/fm/dev/site/vendor/symfony/console/Command/Command.php(298): Behat\Testwork\Cli\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    #47 /Users/fm/dev/site/vendor/symfony/console/Application.php(1043): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    #48 /Users/fm/dev/site/vendor/symfony/console/Application.php(304): Symfony\Component\Console\Application->doRunCommand(Object(Behat\Testwork\Cli\Command), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    #49 /Users/fm/dev/site/vendor/behat/behat/src/Behat/Testwork/Cli/Application.php(124): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    #50 /Users/fm/dev/site/vendor/symfony/console/Application.php(171): Behat\Testwork\Cli\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    #51 /Users/fm/dev/site/vendor/behat/behat/bin/behat(34): Symfony\Component\Console\Application->run()
    #52 /Users/fm/dev/site/vendor/bin/behat(120): include('/Users/fm...')
    #53 {main} in /Users/fm/dev/site/vendor/contentful/contentful/src/SystemProperties/BaseSystemProperties.php on line 19
    make: *** [gc-integration-container] Error 255
    
    opened by frankmckechnie 1
  • Install behat show error on windows 10 (help wanted)

    Install behat show error on windows 10 (help wanted)

    After i install behat by visual studio code ,then i input the command :

    **vendor/bin/behat -v

    1 want check the vesion,but it show error. as bellow:** Snipaste_2022-09-28_15-51-59

    In UninitializedContextEnvironment.php line 44:

    [Behat\Behat\Context\Exception\ContextNotFoundException]
    FeatureContext context class not found and can not be used.

    Exception trace: at D:\science\burger\vendor\behat\behat\src\Behat\Behat\Context\Environment\UninitializedContextEnvironment.php:44 Behat\Behat\Context\Environment\UninitializedContextEnvironment->registerContextClass() at D:\science\burger\vendor\behat\behat\src\Behat\Behat\Context\Environment\Handler\ContextEnvironmentHandler.php:91 Behat\Behat\Context\Environment\Handler\ContextEnvironmentHandler->buildEnvironment() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\Environment\EnvironmentManager.php:69
    Behat\Testwork\Environment\EnvironmentManager->buildEnvironment() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\Tester\Runtime\RuntimeExercise.php:67 Behat\Testwork\Tester\Runtime\RuntimeExercise->test() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\EventDispatcher\Tester\EventDispatchingExercise.php:73 Behat\Testwork\EventDispatcher\Tester\EventDispatchingExercise->test() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\Ordering\OrderedExercise.php:80 Behat\Testwork\Ordering\OrderedExercise->test() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\Tester\Cli\ExerciseController.php:149 Behat\Testwork\Tester\Cli\ExerciseController->testSpecifications() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\Tester\Cli\ExerciseController.php:108 Behat\Testwork\Tester\Cli\ExerciseController->execute() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\Cli\Command.php:63 Behat\Testwork\Cli\Command->execute() at D:\science\burger\vendor\symfony\console\Command\Command.php:308 Symfony\Component\Console\Command\Command->run() at D:\science\burger\vendor\symfony\console\Application.php:1002 Symfony\Component\Console\Application->doRunCommand() at D:\science\burger\vendor\symfony\console\Application.php:299 Symfony\Component\Console\Application->doRun() at D:\science\burger\vendor\behat\behat\src\Behat\Testwork\Cli\Application.php:124 Behat\Testwork\Cli\Application->doRun() at D:\science\burger\vendor\symfony\console\Application.php:171 Symfony\Component\Console\Application->run() at D:\science\burger\vendor\behat\behat\bin\behat:34 include() at D:\science\burger\vendor\bin\behat:120

    behat [-s|--suite SUITE] [-f|--format FORMAT] [-o|--out OUT] [--format-settings FORMAT-SETTINGS] [--init] [--lang LANG] [--name NAME] [--tags TAGS] [--role ROLE] [--story-syntax] [-d|--definitions DEFINITIONS] [--snippets-for [SNIPPETS-FOR]] [--snippets-type SNIPPETS-TYPE] [--append-snippets] [--no-snippets] [--strict] [--order ORDER] [--rerun] [--stop-on-failure] [--dry-run] [--] []

    Need your help,thank you very much.

    opened by hongxianf 0
  • Deprecated error PHP 8.1 compatibility.

    Deprecated error PHP 8.1 compatibility.

    The following error appears working with a Drupal when launching behat tests:

    Deprecated function: DOMElement::setAttribute(): Passing null to parameter #2 ($value) of type string is deprecated in Behat\Testwork\Output\Printer\JUnitOutputPrinter->addAttributesToNode() (line 118 of /var/www/html/vendor/behat/behat/src/Behat/Testwork/Output/Printer/JUnitOutputPrinter.php)

    opened by albeorte96 0
  • --out is positional and applies to the same-indexed --format

    --out is positional and applies to the same-indexed --format

    behat --format=pretty --format=junit --out=some/dir
    

    This yields an exception because the --out will actually apply to the first formatter pretty, not the junit one, creating UX issues and confusion.

    An alternative is to merge the params like Docker does:

    behat --format=pretty --format=junit,target=some/dir
    
    opened by dkarlovi 0
  • --format=junit doesn't work without --out also passed

    --format=junit doesn't work without --out also passed

     ̇$ vendor/bin/behat --format=junit
    
    Deprecated: is_file(): Passing null to parameter #1 ($filename) of type string is deprecated in /app/vendor/behat/behat/src/Behat/Testwork/Output/Printer/Factory/FilesystemOutputFactory.php on line 47
    
    Deprecated: is_dir(): Passing null to parameter #1 ($filename) of type string is deprecated in /app/vendor/behat/behat/src/Behat/Testwork/Output/Printer/Factory/FilesystemOutputFactory.php on line 52
    
    Deprecated: mkdir(): Passing null to parameter #1 ($directory) of type string is deprecated in /app/vendor/behat/behat/src/Behat/Testwork/Output/Printer/Factory/FilesystemOutputFactory.php on line 53
    
    Warning: mkdir(): Invalid path in /app/vendor/behat/behat/src/Behat/Testwork/Output/Printer/Factory/FilesystemOutputFactory.php on line 53
    
    Warning: fopen(/file.xml): Failed to open stream: Permission denied in /app/vendor/behat/behat/src/Behat/Testwork/Output/Printer/Factory/FilesystemOutputFactory.php on line 63
    
                                                                    
      The StreamOutput class needs a stream as its first argument.  
    

    It requires you to also pass --out, but that's not clear from the error message at all.

    Options from discussion in Symfony Slack:

    1. default to CWD
    2. clear exception that --out is now required
    opened by dkarlovi 0
Releases(v3.12.0)
  • v3.12.0(Nov 29, 2022)

  • v3.11.0(Jul 7, 2022)

  • 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.2(Nov 20, 2017)

  • v3.4.1(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)

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 3 Apr 11, 2022
SIMPLE DONATIONS SITE TO TEST DARAJA 2.0(MPESA) API

SIMPLE DONATIONS SITE TO TEST DARAJA 2.0(MPESA) API MPESA FILES donation.php requires pay.php which has the two functions: customerMpesaSTKPush($phone

Emmanuel Bongwe 2 Jul 16, 2022
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 Jan 15, 2022
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.5k Jan 4, 2023
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 24 Jul 22, 2022
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 706 Jan 3, 2023
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 24 Jul 22, 2022
A simple PHP MVC framework without extra files and codes that you don't need

Welcome to (SPM) Simple PHP MVC, just what you need! This is a simple PHP MVC framework without extra files and codes that you don't need.

Van Hudson Galvoso 5 Sep 17, 2022
Easy to use, fast extendable small PHP Framework, like the one you ever missed. The skeleton-APP

About Tufu-Framework Easy to use, fast extendable PHP Framework, like the one you ever missed. Features included such as: Twig and extensions. Fast ro

Giacomo Barbalinardo 0 Jul 2, 2022
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 429 Nov 13, 2022
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 621 Jan 8, 2023
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 150 Apr 12, 2022
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 14 Aug 14, 2022
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 2 Feb 12, 2022
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 14 Aug 14, 2022
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 6 Oct 14, 2022
Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components

Spiral HTTP Application Skeleton Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components.

Spiral Scout 152 Dec 18, 2022
Sunhill Framework is a simple, fast, and powerful PHP App Development Framework

Sunhill Framework is a simple, fast, and powerful PHP App Development Framework that enables you to develop more modern applications by using MVC (Model - View - Controller) pattern.

Mehmet Selcuk Batal 3 Dec 29, 2022