Dwi'n gwneudon ni, Nathan Lisgow. Rhaid i mi fynd i'rai Twitter aliaeth, mae'r IG tag. Gofa hynny'r tala, nhw'n yn dwi'n gwybodaeth oedd yn drwng. Felly ble efallai i'r gweithio i fynd i'r mewn ei ffaith. Mae'r ffordd o mynd i'r gweithio, ac mae'n meddwl yr oedol o'r byd. Mae'n gweithio i'r gweithio i fynd i'r fally ymddangos a'r cyfreiddiadau. Felly mae'r bwysig yn dewid oנוodd Oedden dweud gyda 2008. Yn yw'r 4th gwirio ar gyfer IAC. gyda'r chynyddiad y Drupal Cymru. Rydyn ni'n fawr o'r cyfnodd cyllid y gallu cyfnodd yn ddod o gweithio ar gyfer y byd. Felly, Ieithio'n gyllid, fewn i'r hwnnw i'r Gweithgaredd hon i'r hwnnw, ar ddiwc yn 2006, ac rwyf wedyn yn ddweud o gweithio a'r syniad, ac rydyn ni'n gweithio'n gweithio'n gweithio, maen nhw'n ddweud bod yw'r gweithio'n gweithio'n gweithio'n gweithio. Well, Drupal hadn't arrived yet in my life, that came along in the year 2008, and it was a former colleague of mine, Matt Fielding, who suggested that we might use Drupal to meet the requirements of a project that had quite a unique feature set that we'd never delivered before. The decision to use Drupal or any framework or CMS is often prompted by a need to deliver a bunch of features that we've not had to deliver before. It's not that we're not willing to venture into the unknown. We've all done that before. I've been doing web development for 14 years, so you can be sure I've ventured into new ground, whether for me at least. It's that we acknowledge that the fact that someone has covered that ground before might actually benefit us, and it might actually produce a higher quality of product. The code and features that we use in Drupal Core, much of Contrib, are far more robust than the code or features that we could hope to create alone. The fact that this code is tested in the community and essentially in production across many sites is part of the reason why we can get excited about the Drupal project, and it's what distinguishes it from some other projects. Some of us may feel that we can't deliver much without Drupal, but it can be done. We use Drupal because it has a large and flexible feature set, and the way in which the code is distributed and maintained means that our site's features are being tested, fixed, and improved to a greater extent than our own use, whether in development testing or production could ever yield. Testing is an important aspect of what makes Drupal a great platform to work with. This is a strong selling point for our clients. They understand this, and that's the reason why many of them are attracted to Drupal. For the next period, we have the opportunity to look at BHAT and how it can help us to deliver quality. In this room, we have represented various levels of experience, I'd imagine, with a variety of areas of expertise, but we all have something in common, and it's Drupal that brings us to this conference today, but I'm not going to focus so much upon Drupal because this is a tool that can apply whatever platform you use, but we have that commonality of all being involved in the development of web applications. Not only do we have many diverse disciplines represented here, which should be the case in the DevOps track, and I don't know how about you, but the first time I come across the word DevOps, it was almost like the first time I came across the word email, I just had no idea what that meant, and please explain it to me, and you kind of like look to point the finger and think, is he the DevOps guy, is he the DevOps guy, and then as you learn about it more, it's rather than it being the role of an individual, it's a principle that needs to be shared amongst all members of the team. We gather some requirements, we develop some designs, and maybe we build some interactive prototypes, and then perhaps we begin development, and these are of course loose definitions of far more involved processes, but it's not uncommon for us to sort of check over our work and make sure that it's working at least how we expect, and then when we believe that we've met, we've reached the point that we've met our obligation to the client, we then show the client, and if the client likes what they see then we'll push it to live or we'll go into the next phase of development. Each piece of this process might be handled by a distinct member of the team. We're all good at what we do in this room, right? So when things go wrong and invariably they do, who do we blame for this failure? Maybe the client's expectations, they see the site and they say it doesn't quite work as we anticipated, so who's at fault? Did the client not explain their requirements well enough? Maybe they didn't even know what they wanted, and the loose specifications document that was produced as a result was seen as a sort of vote of confidence in your team. They believed in your team so much that they knew that whatever you deliver would just be exactly what they needed, and that might have happened for you, this rare phenomenon, but the problem with proceeding with this loose specifications document is that it's a weak defence when the client's expectations have not been met for you to say, well, you didn't tell us, you know, you didn't explain it. Like as a developer I would be dissatisfied if I was not involved in delivering applications that met a real business need, you know, it's not just about delivering something, it's about delivering quality. So no team effort, in a team effort rather, no individual success can compensate for the project failure, either completely or in a stage of development. Just as in a football team there are different roles, you know, we might, the defence might have played a really good game, the goalkeeper, whatever, but if the team loses then that sting of project failure is going to, you know, it's going to be felt throughout no matter how well an individual played. So let's set our roles aside for a second. What is it that we in the application world do? We deliver all of us, you know, whatever specific piece of work that we do we should all have our eye on the prize, we should all have a route to success. So what is it that we are delivering? Theodore Levitt said people don't want a quarter inch drill, they want a quarter inch hole. As each member of the team understands what the real problem is and the real value in the application that we're developing then we can begin to engender more quality in the work that we do. By the way this is a principle that not only applies to software development but in attaining any goal. We must communicate amongst all stakeholders what the value is in the work that we are doing. Ultimately the complexity or the time intensity of the work that you've done will pale into insignificance when the work that you've done is considered to meet a real business need. Of course they're going to pay you for that work but they don't care that it took a long time, they don't care that it was really complex. If it meets a real business need, if you want to make your client happy then meet that need. Work hard, that's part of it. In order for us to ensure that we are solving the right problems we need to create a framework to offer assurances to all stakeholders that we are on the right track. This is a good time to talk about Dan North. Dan North created the first ever behavior driven development framework or BDD framework and that was called JBehave followed by a story level BDD framework for Ruby called RBehave which was later integrated into the RSpec project and RSpec was later replaced by the Cucumber project which some of you may have heard of. Dan North's Introducing BDD article appeared in the March 2006 edition of Better Software magazine. The idea of behavior driven development evolved as Dan articulated his response to many of the concerns that he was being faced with when encouraging development teams to approach their projects using test driven development. They would ask where do we begin testing? What do we test and what do we not test? How much do we test in one go and what shall we call our tests and how do we understand why a test fails? I hope to cover some of these responses as we look at what BHAT can deliver to us as a BDD framework but I recommend that you all read this article and I'll put a link to it in the slides. Key to all of this is that we need to communicate more effectively in our teams what the acceptance criteria are for the work that lies ahead. We need a common language. One sure way of not meeting the client's needs is for the development team to have their own way of describing things and they adopt a different language. If we cannot make the effort to adequately articulate the expected behavior of our application then we should not be in the business of developing quality enterprise standard applications. We need a ubiquitous language that acts as a vehicle for our communication between different roles in the software project. Everything that we do should revolve around a business value or user need. We have attended too many user story workshops where the focus of the meeting became more about convincing the client that we cared about the user than actually trying to draw out what the real problems were what the real solutions that the user needed. If a feature being discussed does not deliver a benefit to a given user then we should be in a position to challenge it. The process will help us to deliver not features but business values. The document that comes out of such an exercise can then become a measure for delivery. Our work is done when the agreed business needs have been met. So a feature declaration should contain a user, a benefit to that user and a feature that delivers that benefit. Consider the feature declaration as a website user. I want a user registration form so that the site admins can have my information. There we have a benefit that we should feel inclined to challenge because we need to consider what the benefit is for the user that is encountering the feature. So this process is not only just about getting requirements, it's about challenging requirements and ensuring that what you do will bring real business value. Unfortunately a feature declaration alone will not allow us to confidently deliver an acceptable product to our client. Our client will have or should be encouraged to develop expectations about the behaviour of a given feature. In the case of a user registration form, they must visualise the process of filling out that form and what would happen when the form is submitted. Because if they don't do it at the beginning of the project, you can bet they're going to do it when they actually test the thing. If our imagination is lacking in the planning stage, then it needs to be awakened because resource is expensive and our top developers are about to embark on solving the wrong problem. If we can adequately describe and document the various scenarios that our users will face when encountering this new or improved feature of our website, then we can find ourselves in a position where the client will say, if the feature behaves in the way that we have described here, then we consider this to be acceptable. So a story's behaviour is simply its acceptance criteria. Given some initial context when an event occurs, then ensure some outcomes. Let's take a look what a real example might look like. I've taken this example from the behat.org tutorial and the feature and question is search. This is a perfect introduction to the Gherkin language, which was encountered first with the Cucumber project. We can see here that we have a structure for how to lay out our feature declarations and the scenarios that describe the expected behaviour of this feature. This document is our high-level acceptance test. This document could be used by a tester to verify that the feature works as expected. Any testers in the room? Would you be happy with a document like that to accompany the user interface that you are about to test? You'd be clear on what was expected. So what are we delivering? We are delivering these clearly defined features that the client has deemed acceptable. Developers in the room, would you be happy with a document like the one we saw on the previous slide to direct your work on a given feature? I'm a developer and one of the first things that I concern myself with when I get a new project is what is it going to feel like at the end? Are we going to have a happy client at the end? When I get a loose specifications document, that worries me because it's not clear to me what I need to do in order to make the client happy, in order to meet their expectations, in order to bring value to them. We stop developing when the business value has been delivered. We may be tempted to deliver more than what is expected. This is a common trap with Drupal development, particularly with modules that do more than what you expect them to do. This might work out but you may wish to tread lightly because any feature or behavior will need to be supported and that new behavior which was not documented might not work in quite the way that the client expects and cause you more pain than you imagined. When we achieve the accepted behavior of a feature, we know that we can confidently deliver. In order to deliver, we must test and test often. A few years ago, I was banned for driving for six months. It wasn't for excessive speeding but it was for speeding on a number of occasions for accruing points. I ought to have verified my speed more frequently. I have the tools available for me to stay within the speed limit. In order to avoid speeding, I must know the acceptable speed in the area that I'm in and I must know what my current speed is. However frustrating it is to get a speeding ticket, imagine the struggle to stay within the speed limit if we did not have available to us the speed limit in the current area and if our car was not fitted with a speedometer. As a developer, I should be interested in my ability to meet an acceptable level of quality when working on a particular feature. In fact, this might be a good time to mention unit tests. I want to make it clear that there is no conflict with the kind of tests that will cover the behavior of an application and the tests that will ensure that the smallest components of our application that are maybe the unseen heroes of our application can and ought to be tested on a unit level. While unit tests can help to ensure that we build the right, build the thing right, acceptance tests ensure that we build the right thing. I'm making a habit of this, aren't I? So yeah, this is the slide. These slides will be available later. An acceptance test verifies that the feature works exactly the way the customer team expects it to. As mentioned, it ensures that we have built the right thing. When an acceptance test passes, it indicates that the stakeholder will deem your work acceptable. This is when applications go live, this is when final invoices are paid. So let's mention BHAT. BHAT is a PHP framework for testing your business expectations. It is heavily inspired by the Ruby Cucumber project, and we owe a lot to this man, Constantine Codria Show, for his dedication in successfully porting this project to PHP and being such an advocate for BDD. Maybe before this presentation is through or immediately after you can tell him on Twitter how excited you are about BHAT. The significance for us in the Drupal world is that this library is written in PHP, and many of us are quite confident programming in that language. So let's take a look at BHAT a little closer. Feature declarations are written in the Gherkin language. These documents are passed by the BHAT script library. The behaviour of the feature is simulated as the steps that have been written in the structured feature documents are used to trigger browser events or to report on what is returned in the browser. The result of the BHAT tests is a report telling you if the feature works as expected. The steps in each scenario are matched up with functions in a feature, in a feature context object using annotations. On the screen we see steps that are available in the mink context, which is a BHAT extension. This shows us how the human readable Gherkin language... What's that, sorry? On this one, this here is a screenshot, so I can't on this, I will on the demo. This shows us how the human readable Gherkin language of our feature declarations and scenarios is mapped to a test that can be automated for us. The step given I am on forward slash user is passed and triggers the visit method and passes the forward slash user as a parameter to that function. It is easy to see why someone may have packaged together a bunch of step declarations that we encounter commonly with all web applications. We will find that for many of our applications that many of the steps that we would call upon have actually been predefined in the mink extension. So it is possible to cover much of the behaviour of our applications without having to write much or any PHP code. Of course we should challenge the language used in the steps even though the behaviour of a step might match your requirements. If you do not believe that the human readable language is adequate then I suggest that you go ahead and write the step in a language that means something to your team and then write a PHP method in your feature context that routes to that function which will trigger the expected behaviour. Do not compromise on the language used. I was excited to learn that there is a Drupal extension available for BHAP that makes some additional steps available that may be considered common for Drupal sites and also that bridged some functional gaps that you would encounter on your ground. Otherwise, sorry, when you would be faced with a task of writing a function that determined that you were logged in on a Drupal site or actually logged you in so that you could perform some tests for authenticated users. The efforts of those who have contributed to the mink extension project and the Drupal, so yeah I just wanted to mention so we've got Jonathan Hedstrom and Melissa Anderson to thank for actively working on that project on the Drupal extension and the efforts of those of those two and others who have worked on the Drupal extension and those who have worked on the mink extension means that in some cases covering your web applications with BHAP tests will not require you to write a single line of PHP code because the steps available for these extensions may adequately cover the expected behaviour of the features of your application. BHAP is an acceptance testing framework with the mink extension enabled it becomes an acceptance testing framework for web applications. The browser is the window through which web users interact with web applications and other users. Users are always talking with web applications through the browser. In order to test that our web application behaves correctly we need a way to simulate this interaction between browser and web application in our test. We need mink to do this. Mink is a common gateway between our application and the browser. We still need a browser. If we want to test our applications in browsers that we're familiar with then we need to use the Selenium or Sahi service which should be running on the machine at the time that the tests are on. The benefit of using actual browsers is that you can determine that the site works as expected in browsers that are actually used in production. And also these regular browsers support JavaScript inherently. For many of the tests it may be fine to use a headless browser and the default that ships with BHAP is sort of the Goop browser. And we can benefit from the speed gains involved for the scenario as a website user. When I visit the homepage I should see five news articles unless that content is served up by Ajax then it might be sufficient to allow that to run in a headless browser. Phantom.js is a headless browser which Sahi can interface with. I have been able to use this with good results. We can target specific scenarios to be tested in a JavaScript browser while others can be run in a non-Java script headless browser. We do this by writing the tag at JavaScript above the appropriate scenarios and in the config.yaml file if we have listed which browser and driver to use for JavaScript then it will run that test in the JavaScript browser. So now I'm going to do a demo. Okay. Through the magic 3G. Okay so I've deliberately sort of honed around the tests that the features that are written on the BHAP.org website because I want everyone to come out of this sort of eager to learn, eager to do a bit more than you've already done. Some of you may be more experienced than me but if you haven't used BHAP before please go on the BHAP.org website and run through some of these kind of tutorials and you'll have a good experience with it. So the first thing that I wanted to sort of demonstrate is that we have a lot of step declarations available to us. What's the font size like there? No? It's not good. What can I do about that? Turn the light out? Or can we do the lights actually? Is that a possibility? I don't. Is that better? No? Come closer.  It's only going to be the prompts that are great. Okay let's go. Good. The first thing that I wanted to demo is the fact that like when you get BHAP down and we use the composer package managers to do that and I'm not going to cover the install here it's just too it'll take too long and we've got problems with the internet anyway but you install it and then the first time you're on BHAP not much will happen but if you there are there's a parameter that you can kind of pass that that lists all of the steps that are available. Actually you're seeing there what would be output with a mink context but I'm going to just revert back to using the BHAP context which is what it ships with and you'll see there it comes out with no step declaration so you're going to want to extend the mink extension so I'll go back and do that. Then you've got a bunch of sort of step declarations that will cover much of the behavior of a web application and you get even more with the Drupal extension. So the first feature that we're going to sort of demonstrate and we're going to build on this one is the just one scenario for a search feature so we've declared our search feature here we've specified a benefit we specified the user and we've specified the feature in a descriptive way in a way that could mean something to every member of the team and we've created a scenario given I am on this page when I fill in the search with behavior driven development and I press the search button then I should see agile software development and I'm going to run this in the headless Goop browser by default it would actually go through all of the features but I just want to target this one feature so I'm just going to use the tag that I've created for it called search zero one and it's stepping through there it's going to do this isn't it 3g yay so it's gone through so two steps have passed could be a long day eh how much time do we have because I forgot to start my time okay all right so it passed um we had one scenario there and then four steps and it all passed in our headless browser so I've just built up on that here and um I used a scenario but we want to pass multiple so we want to do multiple tests around that scenario we're not going to accept that it works just because we put in behavior driven development and it returned what we expected we'll put a number of things in there um and so what I've done here is um I've got that example rather than in a scenario it's a scenario outline which acts as a template and it will consider this to be one scenario because we've only provided one input but we could add to that um so we could add like um when I type in clowns I expect to see evil because you do right so let's run that again this is in the headless browser this would normally work much quicker okay so we had one set scenario outline but two that's considered to be two scenarios because we've run through it twice they both passed um and there were eight steps that passed so the next step I'm running that one again actually because of the speed I'm actually going to remove the we know that that kind of works correctly but I just wanted to introduce a second uh scenario so we're covering uh what searching for a page that does exist and now we're going to search for a page that does not exist um and we're just using the scenario rather than the scenario outline uh so um after this one I'll probably just uh rather than running all of them I'll target a couple um so we can just see some some of the other aspects of this had this been running quicker I would have liked to have taken to you about sort of 10 different ones um so I ran through the first one which was uh searching for a page expecting that the page would return a result um and then the other one is expecting that the page would not return a result given a search search term was added and both of those passed so we're building up you know our so library here um and here I've got a scenario outline just as before and I'm going to remove this one entirely just so that it'll run a bit quicker for us um and here I've converted this to a scenario outline and just so that that you can see this actually working in a real browser um I've tagged it with that javascript we don't need javascript to to run this um but we'll see it happening so um the bhat.yaml file which contains the default configuration for this just contains the path for where I want my feature context to live and also what the url is that I'm targeting so if you were targeting the dev url then you would probably have a separate bhat.yaml or there are other ways to do it which would specify the the dev url rather than the the production one and I've also specified that we're going to use goop as well but for the uh to test it in chrome I've um asked it to use sahi to generate the javascript session and to use the chrome uh browser uh sahi when you install it it's by default it's ready to go with chrome firefox and safari I believe I've also added support for phantom js not me added support but I enabled it um there's plenty of tutorials that are available online to help you to do that so I'm actually going to specify that we use that yaml file start sahi so loading up the page this actually might uh this will work because it doesn't require javascript we may struggle to demonstrate the javascript stuff because I have it die after a certain amount of time yeah which is reasonable yeah we still is it and it's still down so it's typed in fish and in england we eat fish and chips that should be expected and I'll break out after this one I think I add two um going so it's looking on the results page um I haven't seen that before but the first one run through successfully anyway so i'm happy enough to move on on that one um so on the next one um obviously that didn't require javascript to do that I just wanted to demo it coming through on chrome um now the next step that we want to do is um we want to test the autocomplete functionality um so when we're searching for a page with autocomplete when we fill in the search with a given term and you wait a designated amount a time three seconds should I increase 60 seconds then I should see behaviour driven development but there uh you know what like if we don't get to see this that it'd be a shame but um I'm there is a step here that I want to introduce so it's going to fail anyway um and I'm going to just remove this for now just to show you what I hope to demo here so this is uh I'm not going to use the um javascript browser here just going to use the goop browser still slow isn't it but um it's going to break basically on the step that says and I want and I wait a number of seconds that step doesn't exist yet and it'll prompt us to add that as a step in our feature context it's even going to give us the code to inject into the feature context as well so we can just copy and paste it in um there are there's also a parameter that you can pass called um append uh append snippets which will actually inject it into the feature context directly uh for you so you don't even need to copy and paste and when I saw that first time I thought man whoever implemented that has way more time than I have but I feel that about a lot of these projects as well I feel you know in awe of the the people that contribute these tools because they have put a lot of work in at their own cost and time and and we do appreciate that um so this this is uh timing out all over the place because they're 3g um but um needless to say the we're encouraged to use the step declarations that are available to us in the mink context and we've got the Drupal context available to us but we can add additional steps so if I go to the feature context it's quite bare at the moment I've added this I'll explain that one in a second but here we've got um like just an example script that that we could use to create our own step and I'm going to create a step that would have been useful for us if we wanted to wait a designated amount of time or you sub sublime gurus are probably thinking what the heck is he doing right now I'm learning okay so the uh the test that we wanted to run is the step that we wanted to run rather I'll just just jump straight ahead for this one so and I and I wait for the suggestion box to appear because the first one was and I wait a designated amount of time so it was and I wait three seconds and the cool thing that it would have done as well it would have generated an example method but it would have also detected that there was an integer in that string and it would have replaced that integer with a brackets uh back uh back slash uh d plus um so that it can actually pass the integer as a parameter to that function so that it makes it just more useful for when you you want to use the same step to just designate different to wait for different amounts of time now what it was decided um on this step declaration is that it didn't it wasn't really using language that meant something to the team we don't wait a designated amount of time we wait for the suggestion box to appear so we've changed the language here to say and I wait for the suggestion box to appear and um go to the feature context given uh it does something to that effect and then it'll it'll suggest that we write off methods in a way that resembles the the language of the step so it'll be something like this suggestion box to appear uh that doesn't need a parameter and then uh the command that we would the uh code that would allow us to wait that amount of time is something to this effect so that the next time it was run that step would it would come across that step it would match it up with the annotation uh that existed in that in the feature context it would run that function and then it would either wait five seconds which I've designated as a time out time or it would stop when the suggestion results box appeared and that can save us a bit of time on the javascript browser as well on it it also just enables it to work it it covers the expected behavior because that's what our users would expect to happen so again here I've got a scenario outline that that we would have used in that instance and it's waiting for the suggestion box to appear and we can just supply different results and if I'd have run this in the chrome browser we would have seen it filling the results the suggestion box appear it would verify that it's that the suggestion is there and then it would pass it and then it'd just run through them all and say that all your tests had passed. Another thing that I could have demoed as well is that on a failure it might be useful to sort of trigger an event and the other day on Twitter I saw that somebody had integrated it with Mantis which was their sort of issue queue platform and on a fail it would create an issue to notify the the appropriate team member to do that and you can attach a screenshot as well. PhantomJS allows you to write sort of scripts that can be run and there's this in my feature context here this after step run function gets run at the end of a step and I'm just saying here if the browser name is PhantomJS and the event and the event get result is step event failed then execute a script and that script takes a screenshot and it saves it into a designated folder and puts a date stamp on it so you can trigger other other events around there. Now there are a lot of the cool thing about BHAT is it's just a script library at the end of the day you can inject it into your code base so it can be part of you've got your doc route and then you've got your BHAT tests and a lot of people have made BHAT tests that cover sites that we're aware of like Drupal.org or Commerce Kickstart and you can just download them and run them on a site that's already up there and the BHAT tests for Commerce Kickstart have been put together by Graham Taylor. I think it's sort of a work in progress but it's just a proof of concept so you can Commerce Kickstart install it on the machine and then run these tests that are written up in these features. I apologise about the internet I would have liked to have shown you some flashy demos and stuff but I hope that the value in what we did see some demos we saw JavaScript working and I would have liked I've got Commerce Kickstart installed and I should have really thought ahead that the internet might die. Sorry, sorry, okay. So now that we've seen a demo, I hope that you can see that this is something that you could easily incorporate into your projects. I hope you can take something away from this presentation whatever your experience of applying user stories, developing acceptance tests or using BHAT itself. If you have never installed BHAT please over the next few days install it and have a play. If you've used BHAT before maybe you've been prompted to use it in a different way or maybe you are fairly familiar with BHAT but you were struggling to communicate to all the stakeholders the value in behaviour driven development and I hope maybe that I've helped you to articulate a little better the value in using BHAT to protect a project from failure and to assist you in delivering business values. So this is a tool for those who care about quality it's for those who care about delivery and it's a structured approach to delivering quality. For me the ultimate expression of automated acceptance testing is in aid in continuous integration and continuous deployment. This might be considered the crucial measure that our latest commit has not compromised the integrity of our application in its ability to behave as expected. Having the application covered with automated acceptance tests makes it easier to confidently deploy a fix or feature enhancement to a site. I'm not going to talk about the merits and challenges of continuous deployment but for those who would hope to be in a position to introduce automation through the release process can you envisage a scenario where you introduce a fix to a website and commit the code into the appropriate Git branch. The simple act of committing that code could trigger a chain of events that could deploy a clone of your production site in code files, database and environment. Your new code could be introduced and a few Drush commands automatically run to trigger the pending update hooks and clear cache. Because you have B-hat tests in the Git repo you should trigger those tests and simulate the behaviour of the whole site and determine whether everything works as expected. A successful run of the B-hat tests could trigger a Git tag being created and deployment being scheduled to the production environment. If the B-hat test fails then we could automatically generate a screenshot of the interface at the point of failure and advise the interested parties that an unexpected failure had occurred. For each release of our application we should only have the tests in the code that cover the behaviour of the application in its current state and not the tests that cover the behaviour of features yet to be developed. Integration is often very painful. It's a painful process. If this is true on your project, integrate every time somebody checks in and do it from the start of the project. If testing is a painful process that occurs just before release don't do it at the end. Instead do it continually from the beginning of the project. If releasing software is painful aim to release it every time somebody checks in a change that passes all the automated tests. Reaching a level of acceptance tests that can be considered a benchmark for quality would open up the door to such a possibility. Whatever the challenges are for implementing continuous delivery one thing is for sure we could not do it without automating our acceptance tests and B-hat helps us to do that. In closing I want to say something about the word acceptance or acceptable. I used it in my session title and we encounter it most commonly in the phase of project delivery called user acceptance testing. Maybe when you started out in this business you hoped to do more than acceptable work. Maybe when you started sorry you hoped you would be involved in delivering exceptional work. Let me say this in order to exceed a client's expectations you must first pass the post of achieving their expectations giving a client what they expect is not to be underestimated. The expected behaviour of a set of features designed to meet the real business needs of the users of an application is the foundation of exceptional work. Thank you. I invite any questions if you do have a question or comment please come to the mic and I do really want your comments as well if there's something that you've been itching for me to say you've been using B-hat in a cool way then please come up and tell us about it. Do you mind coming up to the mic is that okay because then we can get it on the tape it's just in the middle of the room. The practice of actually sitting down with your client and writing your specification in this format what are the tools for actually getting the things written you know you can sit down there and end up with pages and pages of these docs but what are you trying to do when you sit down with a client and write up the specification in this BDD language is that because that is part of your mission isn't it your spec is your test yeah well it's important first of all that whatever we produce is considered to be the definition you know so what we want to get away from is having you know this is the best we could do in this meeting and then have it translated you know and then we'll all we'll write the proper specification document at a later time because you'll lose some of the value of the application and so people are worried that these meetings that you have with the client to draw out all of the scenarios that might cover the accepted behaviour would be long and laborious but we only need to get to the point where as I said in a presentation if it works as documented in this document and we've got the facility here of the gherkin language so we can use that as a structure and I believe that there are plugins either being worked on or available for various text editors if it works as described here then it's acceptable and you need to get signed off on that yeah does that sort of answer it yeah it's just a matter of how easy is it to sit with your client in a meeting and write these things in a way that is useful so you don't rewrite them again so it's easier than handing the fallout of not doing it yeah thanks so Simon said that there is a gira extension which allows you to put the tests in gira and that's true um I know some people that are doing it I've not implemented it myself so you can actually put them in gira and it will um you enable the gira extension and actually sort of use the apis and get the tests from gira and that can be helpful as well but I think it's important that they're also in code as well so that we've got you can just check out the code and know what tests to run for that code because you might want to roll back for something like that yeah a question as well I'm kind of new to this maybe a stupid question but suppose you have a test and it it changes your data some way and you have a lot of tests how do you prevent that the change of the data in test A has an influence on another test um yeah um ideally every test every scenario should be used in isolation and there's a there's different ways of doing it but I think with a triple api extension so I was using the drush extension or I would have been using the drush extension to log into a site and perform a test as an automated user and is rightly it's making changes to the database but cleanup could be done after every test um so that it's as it so that you could target that test and no other test would impact upon it so you just after the test you delete delete the user if you've created a user so you may create a dummy user to run that test delete the content yeah okay thank you yeah that would be the the desired effect yeah that one was uh what we did is we created a tag which was destructive test so anything which we classed as destructive it wouldn't get run on live so if we made a deployment that created um like so it had a test that created this new content to see that it worked when we we'd run that on our dev environment but we never sort of went live with that and then we had a cleanup thing as well but yeah that's a really useful thing I'm going to repeat that because it wasn't on the mic so he's saying there that he um was able to identify um test that would be destructive and that you would never want to run on live some tests you're willing to run on live so uh rightly so you can tag those those tests those scenarios and just as I tagged um I was running just a specific tag if you rather than using the ampersand you use a tindle uh you can say um run everything except um and so that's what you've been doing there and he's found that useful um so with uh well uh behaviour tests you're really testing more the the user interface so the thing that you can actually explain to the client and then you have unit tests which are really technical sometimes there are some tests which are really so integration tests acceptance tests but are really something that only your developers will understand so you want to test some edge case how do you really integrate those do you put them in in some I want to test crazy edge case and then you actually implement that or there's probably a multitude of answers for that because it would depend upon circumstances it may be that if you cannot describe it in a way that actually aligns it with some business value then then maybe there's a missed opportunity there and you could go back to the drawing board a little bit because it's sort of well documented that if you actually tie everything around a user need that that you can sort it's a process of creation of innovation but um people are using be hat in different ways the be hat itself without the mink extension it's an acceptance testing framework but and people are using it for unit tests functional tests and so if it helps use it yeah I think the key message here and I think that what I really like about the guys who have written be hat is they're saying the the right things initially when Constantine um began writing the be hat tool he didn't envisage using it in the ways that it's being used and the first time that I saw him present on it was at Symphony live London last year and then I saw him again in Manchester um and he didn't do a demo at all and I was like um if I'd have known ahead of time that he wasn't going to show us his mad vim skills then I would have been disappointed because in London he was doing it in front of your eyes sort of like inputting stuff like tests doing tests and then and then um not doing any development until there's a test to cover it but what he talked about is its ability to assist you in delivering quality and ensuring that that agile process is protected and and this is the message that we need testing is important but what we've struggled with is selling it to every member of the team this isn't just about testing it's about delivering what the client needs thank you


Tommy O'Brien, good morning everybody. I'm Tommy O'Brien coming to you live from TFNN 830 a.m. Thursday morning markets going in both directions right now we're in the red you get the Dow futures off 164 points trading 24,402 S&P negative by 17 trading at 2923 Nasdaq futures negative by six points trading at 9,029 as we speak awaiting the weekly jobless claims number that number gonna hit 3.8 million got a love the Tigers Dan folks they got that information in there before I could find it anywhere else 3.8 million weekly jobless claims that number coming in you see a little bit of volatility happening in the S&Ps on that number but still in lower territory off about half a percent right now jumping over to the commodities gold contract up about $12 at 1726 gold had made a high at about 345 this morning of 1737 oil contract catching a bit as well check out that acceleration $17 and 29 cents up from a low of $10.07 just early Tuesday I mean you're talking about that's basically five in the morning on Tuesday you're talking about 50 hours five zero you go from 10 up to 1725 up about 14% right now you know what I didn't cover yesterday which I meant to cover was bitcoins run on the program check that out bitcoin from 7800 up to 9500 and that is at about two in the morning you dip down to six in the morning to all the way down to about 8800 so moves there in bitcoin and jumping back to the other charts will start things off will start off with the indices Dow 30 making it to a high of 24,784 pretty muted response on that jobless claims number the market basically I guess expecting 3.84 pretty much in line we've now hit over 30 million over the last six weeks for weekly jobless claims why not we'll pull that headline over there it is 30 million over the last six weeks weekly jobless claims were expected to hit 3.5 so we committed 3.84 pretty close to that number all things considered jumping over to other stories we have happening this morning we got a bunch of earnings already out whether it's last night whether it's this morning and of course we get some big numbers Amazon out today among and many others Apple as well I believe Twitter shares out with their earnings let's jump right into the equities strong first quarter results despite expected downturn from coronavirus Twitter Pulitzer guidance for the quarter at the end of March blaming the coronavirus for the slowdown getting into the numbers earnings per share 11 cents revenue 808 million Wall Street had been anticipating earnings per share of 10 cents on 776 million Twitter shares this morning there's your volatility spike up to 3550 the conference call beginning at about 8am not going well I would say not sure what's being said on that conference call but we've had quite a slide from 33 to under 30 now on that conference call other news how about last night we had Facebook out with their numbers soars after reporting stability in ad revenue after fall in March boy these tech companies pretty much knocking it out of the park so far the company's revenue came in at 17.74 billion up nearly 18% from 15 billion a year ago I mean remarkable right it counts 2.99 billion monthly users across its family of apps compared to 2.89 billion I bet Zuckerberg wanted a three there but I bet they'll get there next next quarter regardless Facebook shares there's your action on that news how about the spike last night from 195 to 217 we're at about 209 89 of course jumping around Google you had quite the acceleration on their earnings last night Amazon catching up bid this morning from 2372 we're bid bid in 24 22 by 24 24 right now on the price of Amazon other news items for earnings how about Elon Musk continuing to make a name for himself went on an quote unquote expletive laced rant during the Tesla earnings call talking about the stay at home orders as fascist I was seeing some of these quotes there's your quote they're forcibly imprisoning people in their homes against their constitutional rights but that's my opinion and breaking people's freedoms in ways that are horrible well that's his opinion that was the Tesla earnings regardless of that side show going on Tesla delivering in a big way from 800 we're at about 863 right now you made it all the way up to 886 on the Tesla numbers last night let's see if they have the actual numbers in here so here's the bummer right he goes on this expletive laced rant I pull up an article and they don't even talk about what Tesla actually did why is he taking away from great numbers that they had it's a bummer he continues that side show Microsoft stock also rising on earnings beat and better than expected guidance so Azure revenue growth came in at 62% higher than what some analysts have predicted that is their cloud earnings a buck 51 excluding certain items versus a dollar 32 expected how about this beat revenue 36.91 billion versus 35.68 you're talking about 1.23 billion dollars in 90 days of extra revenue while this is all going on of course Microsoft entrenched in a lot of what we do online Microsoft teams getting a lot of action pairing some of the gains we had last night from 177 up to 186 back to about 180 right now on Microsoft opening a bit higher pretty muted response so far on that weekly jobless claims number just checking back in on the S&Ps you see the slide from where we were at about yes this is last night at about midnight 2965 was the high there zoomed it back out there's your trading day yesterday trading higher and 2965 overnight but we're at about 2928 so you're approaching about 40 points off the highs that we had last night jumping back into it I'm going to talk about this one early because in 24 minutes from right now Tom's going to be hosting his timing of the trade webinar still time to sign up you sign up you instantly gain access to the webinar starting at nine o'clock that'll be archived if you can't attend live if you can't get into the chat room if you're just on mobile you're somewhere you can't access it all of it's going to be archived nine till noon a lunch break and then one till four six hours in there with Tom it's a great time to be in there for a time in the trade webinar folks you also gain market insights his daily newsletter you get a copy of his book worth the 395 by itself without any of that but you get a couple add-ons and that will be archived that starts at nine o'clock and I'm going to be doing the show with Basil Chapman at 10 o'clock this morning he's going to be filling in the saddle filling in that seat for Tom I'm looking forward to getting his take on some of these peaks and troughs Basil did a one day webinar a couple weeks ago as well you can actually still find that webinar under the services tab if you'd like to check out that archive but Tom's going on live this morning 23 minutes from right now check that out on the front page of TFNN and while you're at it the open house this running through tomorrow the last day folks we've been running this started it during quarantine it was almost like probably six weeks ago that we started this amazing enough and we're running it through the month of April we're going to let it run out May 1st tomorrow how about that tomorrow right May 1st it sure is May 1st so this will run through tomorrow check out the open house folks this morning as I mentioned I'm refreshing CNBC out there and our man Peter from Park City's got 3.8 million jobs announced in the den before I could find it anywhere else always good stuff in there checking back as we wrap up the first segment the VIX 3255 and we're getting a little bit of a sell-off maybe we'll have a little market action for that timing the trade webinar as the S&Ps now approaching the pre-market session lows down 20 points check out Tom's webinar folks on the front page at TFNN.com sign up right now you'll be ready for that nine o'clock start we'll be right back if you're in the CD market and looking for a secure investment the Tiger First mortgage program may work for you the security for these first mortgages are building lots in the tax opportunity zone in St. Petersburg, the tax act of 2018 set up tax-free zones across the country where you can build and hold for 10 years and pay no tax on the profits which makes these lots valuable the investment is anywhere from 30,000 to 75,000 the interest paid is 7% yearly paid on a monthly basis according to bankrate.com the best rate for a four-year CD in the country as of February 20th is 3.1% a $50,000 investment at a normal four-year CD rate of 3.1% would give you income of 1550 per year or 6200 over the four-year period that same $50,000 investment in the Tiger First mortgage program would give you 3,500 per year or 14,000 over the four years what should you prefer 6200 or 14,000 of interest on your investment if you'd like more information about the Tiger First mortgage program you can call me at<PHONE_NUMBER> that's<PHONE_NUMBER> the gold market has taken off topside in a large way in 2020 if you want to take advantage of this sector now is the time to subscribe to my Gold Report the Gold Report took profits in four of its equities in the Gold portfolio in the first week of January for a combined profit of 99.2% with two positions left in the portfolio that have a profit of 67.5% as of January 7th the Gold Report is a comprehensive look at the metals sector as well as the markets that move gold which is the currency and bond markets new subscribers get a 30-day money back guarantee so you have nothing to lose every Monday morning I publish the Gold Report with coverage of gold silver bonds the XAU, HUI, GDX as well as more than 30 different mining equities to see for yourself the types of profitable trades that are recommended within the Gold Report sign up now by visiting tfnn.com don't miss out on the next great gold trade sign up today are China A shares hot or not if you trade China A shares now may be time to take a closer look trade CHAU or CHAD directions daily CSI 300 China A share bull and bear ETFs China A shares in either direction visit direction investments.com today an investor should consider the investment objectives risks charges and expenses of the direction shares carefully before investing the prospectus and summary prospectus contain this and other information about direction shares to obtain a prospectus or summary prospectus please contact direction shares at<PHONE_NUMBER> the prospectus or summary prospectus should be read carefully before investing an investment in the funds is subject to risk including the possible loss of principle the funds are designed to be utilized only by sophisticated investors such as traders and active investors distributor foresight fund services LLC don't forget you can listen to tfnn live on your mobile device 24 hours per day go to tfnn.com then hit watch tiger tv that's tfnn.com then hit watch tiger tv for the latest market information welcome back folks uh s&p slipping a bit now 2918 we're now at pre-market session lows you see a little bit of a sell-off since 835 we've dropped about 12 points in those s&p's that dial now off about 208 trading 24,359 jumping back to the news of the day uh i wanted to get where were we no i was looking at this might be the best month for the markets i had something there we go so stock surged on wednesday the s&p 500 is up more than 13 percent for the month now we just went over it this is the last trading day of the month right now tomorrow may 1st s&p is up more than 13 percent for the month and on track for its biggest one month game since 1974 dials up 12 percent in april which would be its best month since 1987 right on the board though the month is not over just yet we got a lot to go to in terms of earnings so we do get uh amazon and apple after the bell today jumping into other stocks with action mcdonald's earnings falling 17 percent as coronavirus leads to restaurant closures plunging sales so even with the drive-through is packed mcdonald's not keeping up with where they were mcdonald said in early april that same-store sales fell 3.4 percent during the first three months of the year the company's earnings fell 17 percent with druids 2020 outlook and long-term forecast issued just in february earnings per share 1.47 dollar 47 revenue 4.71 billion net sales dropped 6 to that 4.71 billion so mcdonald's down a bit on that news this morning i was looking at them earlier you were up to about 190 on that number now the conference call just beginning at 830 when i came on the air but you got mcdonald's down about four dollars from 187 to 183 right now on that news what else we have happening jumping over to other equities zoom i wanted to talk about for a moment so they chose oracle as their cloud provider and uh microsoft and google not winning that contract and not surprising folks when you think about the deal made more sense wednesday after cloud infrastructure providers google and microsoft made it clear that they're going after his rooms core business reason why i want to talk about this be very careful with this company zoom they might be around for a while the world has definitely changed on a longer term basis um we're going to be communicating whether it's microsoft teams whether it's google duo i don't even know what google they might google it must have a hangout right i think they wrapped that one up but uh just a run though that we had from where this began you could say in february at a price point of 77 you made to 181 and the volatility here they have to convert people from free accounts to paid accounts to make money number one or they have to start dealing with businesses that will pay them for their services and they have to do that in the face of competing with facebook google microsoft apple amazon why not right um tough sector to be in especially when you have to live up to the growth that your stock just doubled in a period of three months um be interesting to see how that all shakes out for zoom mesis they're going to be having all of their stores opened in six weeks it expects to have it's roughly 775 stores reopened in six weeks should COVID-19 infection rates taper off and local governments allow retailers to proceed all the macy stores have been shut down since march 19th going on almost six weeks macy shares and um in florida i'm sure i agree with it or not um but we're going to start opening back up on monday retailers are going to be allowed to be open with 25 percent capacity restaurants um similar fashion i believe um not yet opened talking about movie theaters nail salons salons of those sorts but 20 i guess that's a phase one so you can see how macy's if we're already starting over the period of the next six weeks but macy shares flat so far about quite the drop off recently from you're talking about 18 dollars at the beginning of the year we hit 438 we're currently trading at 607 for macy's other news comcast post dramatic drop in q1 profit despite cable and broadband bumps amid coronavirus stay at home 2.1 billion for comcast in net income for the first quarter that's roughly 40 lower than the first quarter last year when they earned 3.5 billion revenue jumped 4.5 percent year over year helped by a 52 percent surge specifically in wireless revenue the company's filmed entertainment revenue fell 22.5 percent year over year and theme park revenue fell 31.9 you know disney out with their earnings next week um revenue from theme parks non-existent for the last seven weeks at least probably six weeks cmcsa we're going to open a little bit lower but you see the dive from 47 to 31 back to 39 and this morning for a shorter time frame we're trading down a bit you got a pop on that news we have the conference call beginning at 8 30 there's a 15 minute bar and we're trading lower on that conference call number we're now bidding 3821 by 3850 other action out there stocks making moves craft hines reported quarterly profit 58 cents a share three cents above estimates revenue also topping expectations organic sales rose 6.2 percent craft hines benefited from the increased consumer demand related to the COVID-19 pandemic there's your volatility opening about 60 cents higher at 31 15 from 30 53 signal with their earnings 469 a share they were looking for 435 revenue also above forecast sigma ci as their shares trading a bit higher from 195 up to 203 right now at 199 we covered Microsoft covered Facebook we covered Tesla's rant we did not cover their profit yet though as I mentioned so to get into the numbers there's Tesla earnings per share a dollar 24 revenue 5.99 the market was expecting an adjusted loss of 36 cents a share how about that however estimates varied widely and comparing Tesla's actual results with estimates is in straightforward given the difficulty what's going on with the coronavirus company reported GA AP profit during the first quarter of 16 million pulling up Tesla again quite a pop they got of like 60 $80 yeah we're at 855 up above $55 but trailing off a bit as you can see from that when the conference call began things have tapered a bit but still quite a performance for Tesla in the last 90 days what else we have happening what kind of headlines I got up here qualcom beating estimates by 10 cents a share with quarterly profit of 88 cents a share revenue beat consensus as well q-com those shares so far after their numbers last night spiked to 8301 right now you're trading in about 79 40 up about 40 cents pairing a lot of those gains last night that we did have there ebay out with their numbers 77 cents a share 5 cents above estimates revenue topped estimates as well the company said its marketplace business has been helped by worldwide shelter-in-place orders and it gave stronger than expected guidance for full-year earnings and revenue not pulling guidance giving stronger than expected guidance gotta love that but check that out talk about some volatility on their numbers last night from 41 almost to 3670 you've trailed lower you're down about a dollar 40 at 37 61 on ebay shares exxon mobile they reported they're gonna maintain their quarterly dividend of 87 cents a share at a time when of course many in that industry are giving it up to conserve cash royal dot shell they did just that slashing their dividend by two-thirds exxon and we just talked about oil just went from $10 to 17 this month you see the acceleration up to 49 we're gonna open just a bit in the positive for exxon shares so far this morning at 47 71 checking in on two of the companies with earnings after the bell amazon shares up a bit 30 so dollars 40 dollars almost at 2410 getting a little bit of a pop this morning and apple shares as well 289 right now from 287 we're up to 293 50 as we get both of those numbers after the bell you are the best at everything you do in life it's the most common trait that we tigers and tigers share if you're looking to become the best of the best when it comes to managing your money let me teach you to do what most wealth managers tell you can't be done which is how to time the markets i'm steve roads author of mastering probability and for the last 12 months timer digest has been tracking my newsletter signals which have earned me the ranking as our number one market timer in the nation for the s and p 500 for the last 12 6 and 3 months timer digest also ranks me as the number one market timer for gold as well the fact is markets can be timed and i'll teach you the exact set of tools that i use that has transformed me into one of the best at what i do sign up for mastering probability today by clicking on the newsletter tab on the homepage of tfnn.com and get immediate access to workshops where i take you step by step how to use an extraordinary set of tools as well as provide great market calls to sign up today if you haven't checked out the newsletters page of tfnn.com what are you waiting for all of the tfnn newsletters are informative up to date affordable and must have for every trader looking to gain a competitive informational edge in today's markets tfnn newsletters cover every aspect of the markets to offer you the very latest in market news plus new subscribers get to test drive our newsletters risk-free for 30 days from all aspects of the markets including stocks bonds metals commodities and tech there's a newsletter to fit your needs exclusively from tfnn stay informed each day you trade and get that competitive edge that will help you stay ahead of the game visit our newsletters page by going to tfnn.com and click the newsletters button near the top of the page tfnn.com educating investors you know what's cool taking something that's good for you something specifically formulated to help with weight loss better sleep stress reduction and the need to detox nico our hunter and gatherer ancestors found all their nutritional requirements for health in their wild environment but today our food sources no longer contain the vitamins minerals and nutrients our bodies need to stay healthy and strong that's why we need primal edge daily nutrition it includes a special blend of ionics oil based vitamins minerals baddie and amino acids in an easy to use liquid form primal edge is powered by highly concentrated folic and humic acids natures prefer delivery system they've been called miracle molecules because like sunlight air and water life cannot exist without them that's right page they ensure we receive all the nutrition we need to be healthy and thrive we take it every morning primal edge formulated and approved by nico and page of living a primal lifestyle buy it today for just $89 click on the primal edge banner on the front page of tfnn.com don't forget you can listen to tfnn live on your mobile device 24 hours per day go to tfnn.com then hit watch tiger tv that's tfnn.com then hit watch tiger tv for the latest market information welcome back folks we got markets sliding to negative territory a bit that's american airlines they're out with their numbers as well this morning american trading from 12 63 up to 13 56 overnight but this morning reporting their numbers and dropping to 11 82 american there's your number 2.2 billion the loss in the first quarter as the coronavirus royal air travel jumping back to the weekly jobless claims number so 3.84 million we're over 30 million over the last six weeks taking a look at a little bit of a trend so last week's number was revised upward by 15 000 to 4.4 million you do see the trend trailing down it's pretty tough when you look at last week was 4.4 million this week now coming in at 3.84 million we're still almost at 4 million if we're trailing off in a small degree man it's going to be a rough go as these things continue hopefully some of those jobs that were lost as the economy reopens those people coming back into the labor force this talks about that they may be undercounting yeah where were we i had it okay we'll jump back into it but that talks about of course the gdp down 4.8 here we go here's what i had i want to talk about the economic policy institute earlier this week estimated that the current claims level probably under counts by as much as 12 million those who are eligible for benefits but not getting them due to inability to file or other rule blocks uh it's definitely some number folks that people are out there that aren't employed that haven't hit those rules yet not sure what that number is final check on the s and p's down almost a full percent 29 13 you see the drop off from the 8 30 jobs number even we're up at 29 30 we've lost almost a full percent on that number stay tuned folks we got larry pizvento coming up live with trade what you see i'll be back at 10 o'clock with basil Chapman filling in for tom and don't forget folks you got time it's starting right at nine o'clock quite a day for it weekly jobless claims almost four million check it out timing the trade webinar with tom out brian sign up you'll gain instant access to that trading room i'm going to jump in there right now between nine and ten o'clock before my program and i hope to see in there check it out the front page of tfnn and we'll be right back with larry pizvento coming up live with trade what you see


I think she did a really good job of just really setting an example of what work ethic is and what hard work can get you. Sometimes it's kind of cliche, but just having my mom has just always been a blessing, just being able to have that relationship.  And as many jobs as she worked, you know, for us to have a great Christmas or whatever it was, she never missed a game either. That support system that I had, you know, growing up really meant a lot, how you spend your time and just multiple aspects of life that I was able to not look on a video and look at, you know, my favorite athlete doing it, but I was able to watch my mom do it. A really cool experience and I, you know, I get emotional about it and I'm able to joke about it now with my mom, but yeah, I don't know what I would do without her.


We keep going through him, okay? So I'm here, I hit, he scrolls, go ahead and scroll, okay? Right here, square up, square up, come around, come around. Scrolls here, take a big step, keep going through him. I never slow down, okay? Go through it all at once. See that? Can you imagine trying to come back, dumping to the side, okay? How heavy it gets, okay? That's why we don't want to, we don't want to, or that's why we want to go through the guy, through our opponent, okay? One more time. So big step, big step. Say I stepped up and went through him, okay? Let me try it, here we go. Guy's sprawling and he's finishing here, okay? One more time here, finish the move. Questions, go, go.


The whole point is back to the vision of this administration to make sure that SMEs get reliable, adequate power supply and they have a place to complain if anything happens. But all four are tamed to within a 12-hour period. So each of these, we have how many of these do you have? We have 150, 100 kPa transformers.