Unit Testing Tools in Visual Studio 2017

Aug 2, 2018 17:32 · 5430 words · 26 minute read

>> Hi, welcome the Visual Studio Toolbox. I’m your host Robert Green, and joining me today is Kendra Havens. Hey Kendra.

00:05 - >> Hello. >> Welcome back on the show.

00:06 - >> Thank you so much for having me. >> We’re going to talk about Unit Testing.

00:10 - >> Yeah, it’s the unit testing episode. >> Which is not the most exciting subject maybe people are thinking, but that’s why you’re on the show to add some excitement.

00:17 - >> Excuse me? It’s just because they don’t know about all these cool features we’ve been cramming in.

00:20 - >> That’s right. >> So, this is why we’re here to talk about it.

00:23 - >> Unit testing is, it’s a tricky subject, because it’s like everybody knows you should do it, but what are the tools? How do you write unit tests, et cetera, et cetera? We’re going to do a series on that later on in the summer, but in the meantime- >> Really? Okay.

00:37 - >> Yes. >> Excellent. >> We’re going to have [inaudible] back on to do a series on unit testing.

00:43 - >> Excellent. That will be really good. >> In the mean time, you’re going to show us great tooling in Visual Studio.

00:47 - >> Yeah. So, the purpose of unit testing is actually one of the first things I want to talk about.

00:52 - And I can talk about our Roslyn team example.

00:54 - Then I’ll go over learning resources that people tend to miss a lot.

00:58 - In general, this whole episode will be about announcements that are really easy to miss during like conferences and all of our big releases, and in blog posts, and stuff.

01:10 - So, I’m just going to be highlighting all of the ones that have to do with testing and more of a focused- >> Cool.

01:15 - >> Okay, you hear what I’m saying. So, learning resources, latest testing improvements, I’ll demo all of those, and then more of our Visual Studio testing tools that maybe we haven’t talked about in a while that I’d love to bring up again.

01:27 - >> Cool. >> Cool. So, purpose of Unit Testing.

01:31 - I love using the Roslyn example. I work on the Roslyn team, which is the C# and Visual Basic compiler.

01:39 - So, as many people know we went open source, and we architected the compiler in a way to be extendable.

01:47 - So, we wanted other community contributions, and as a result of that, last year 60 percent of. NET contributions were from open source.

01:58 - The only way our team could possibly keep up with that many PRs is through our tests.

02:05 - So, we have 86,000 tests on Roslyn. Learning how changes were effected in a pull request, looking at your test is a great way to do that.

02:18 - So, it helps the reviewing experience a ton.

02:22 - So, that’s a really big example, that is our bread and butter on the Roslyn team is actually having tests.

02:30 - >> That sounds like an awful high number of test, is it? >> It is. We’ve got millions of people who use it in thousands of scenarios.

02:38 - >> It is kind of an important feature of the product, C#.

02:41 - >> It’s definitely paid off. >> Yeah.

02:43 - >> Yeah. With our team having those, it’s the only way we could have kept up with those changes.

02:48 - Right. So, here are the learning resources that I think a lot of people might have missed.

02:53 - I get a lot of questions about like, “Hey, how do you test legacy code?” And I’m like, “We’ve actually done an episode on that, on Microsoft Virtual Academy.

03:01 - So, just go to Microsoft Virtual Academy, and you can look up our sessions on testing legacy code, and test driven development. “ That’s also really excellent.

03:13 - A lot of people also miss that MSTest and VSTest are open source on GitHub.

03:18 - >> Okay. >> So, you can look at Docs and issues, and they’re very informative.

03:22 - Especially if you’re running into a bug, a solution actually might be on the repo, or at least the discussion to know what’s happening with it.

03:30 - So, that’s kind of a pivot, like you could either go to a developer community and just file the bug.

03:36 - But if you’re actually trying to like find the work around, or see if we already engaged with the community on that, there could be issues in those repos too.

03:44 - >> Okay. >> So, that’s really helpful.

03:46 - Of course, if you’re using. NET test, the. NET CLI is also all open source on GitHub.

03:53 - So, that’s an third repository to look at. So, very latest testing improvements, massive performance improvements, I’ve showed you a few of them before.

04:02 - We’ll go over into it and just focus on the testing.

04:05 - A lot of that’s due to real time test discovery as the newest source based type of discovery that we checked in that no longer relies on assembly base, so it doesn’t require build.

04:15 - Pretty cool. There’s also been huge test framework improvements in NUnit, xUnit, and MSTest.

04:21 - Oh, qualifier for this episode, it’s probably going to be a lot of. NET focused stuff, because that’s my life.

04:27 - So, if you want to learn about C++ testing improvements, they actually wrote a blog post not too long ago with some of that, but that’s what it is.

04:36 - So, I do want to urge a big push to update your TestAdapters, because as you can see, execution, this is in our lives.

04:45 - Test execution of over 10,000 generated tests by Visual Studio Update by Framework has gotten so much faster.

04:53 - So, just updating your TestAadapter is such an easy thing to forget to do, because you’re always focused on the Framework version.

05:01 - You don’t often think about the TestAdapter version, so please, do that, it’s awesome.

05:06 - That’s your test discovery type and improvement as well.

05:09 - So, just updating your TestAdapter there will also improve it a lot.

05:13 - Cool. So, latest test experience improvements, we’ve got the Hierarchy view in the Test Explorer.

05:19 - >> Latest being as of when? >> Latest? Oh, so the hierarchy view was added in 15. 6.

05:24 - >> Okay. >> That update. Yeah, and that’s all I got from this site.

05:29 - It sorts your test alphabetically, and it organizes your tests by project namespace and that’s- >>In other words it’s there now, it’s not coming in the fabled 15. 8.

05:38 - >> No, it’s here. >> Excellent. >> It’s here.

05:40 - It’s been here for months and people love it.

05:42 - >> Cool. >> If they know to update to get it, because I still get requests.

05:47 - Yeah. So, we’re still designing the hierarchy view and we’re open for discussion, but-.

05:52 - >> Okay. >> Enough talk. >> Enough talk, more demo.

05:55 - >> Jeez, that’s a lot of talk. Robert didn’t want me to use the PowerPoint, but I was like, “Please, what if people forget what I said because I talk too fast?” Anyway, let’s increase the font size there.

06:07 - So, now you can see the Test Explorer over here, that’s what I what you call your attention to.

06:13 - So, I have a large test project. If I go ahead and unload that project, you can see the Test Explorer will update automatically, and if I reload it, it can discover 5,000 tests within just a few seconds.

06:26 - Boom, done. Pretty sweet. So, I’ll go ahead and use the hierarchy to go ahead and navigate.

06:34 - So, this is my project, namespace, and my class, and I can show you how the source based discovery works.

06:44 - I can go ahead and add that test, and then it will also automatically appear right in the Test Explorer.

06:50 - Pretty sweet. And if I change the name- >> You don’t have to build first? >> Don’t have to build first.

06:54 - >> Oh, man. That is awesome. >> Yeah, pretty great. So, if I comment it out, it will also then just disappear.

07:01 - >> That is extremely cool, because in a large project like this, it can take some time to build.

07:06 - >> Yeah. Yeah, just having that context, and not like having to rebuild, and then re-find your test, and then run it, big time-saver.

07:20 - So, what I also wanted to call out was this summary line is also something we added.

07:25 - So, this is sort of a global view of how many tests are in your project, and then it says two failed.

07:30 - Right at the top of the Test Explorer as well.

07:33 - That was also a pretty popular customer ask.

07:35 - The last thing I wanted to show you is updating your TestAdapters.

07:41 - That’s really easy to do. Just type in NuGet, and open your NuGet Package Manager for your solution, and go ahead and type in “test. ” Click on your TestAdapter, and move to the latest table is my high recommendation if you want some sweet, sweet performance improvements.

07:58 - >> Okay. >> Okay. So, next slide. So, I also get asked a lot, “How do we make writing tests easier?” I find a lot of people might have missed some of the awesome features that we’ve checked in.

08:13 - >> By completely automating it. >> By completely automating it. Right.

08:17 - >> Yeah, that shouldn’t be too hard. >> That could be pretty easy.

08:21 - Especially if we’ve actually checked in that feature to Visual Studios.

08:25 - So, we always want to kind of bring more attention to it, especially when people ask me for it.

08:29 - So, right clicking and generating unit test stubs for. NET Framework projects, that’s in all versions of Visual Studio.

08:37 - It’s just really easy test method stub generation.

08:39 - >> The stub? >> Yeah. >> Not the test itself.

08:41 - >> Yeah, the test itself- >> How horribly difficult would that be by the way? >> Well, that brings me to our next feature, IntelliTest.

08:49 - So, this is also only for. NET Framework projects, and IntelliTest is only available in enterprise, but that will actually generate and look at all the logic in your method, and generate a test for each logic branch.

09:03 - I can show you that in just a minute. >> All right, cool.

09:05 - >> The next thing I’m going to call out is code coverage, also an enterprise only feature, and how it can integrate into the VSTS pipeline.

09:12 - >> Cool. >> Okay. So, we’ll escape PowerPoint again.

09:15 - Sorry. Now, I feel like I’m using it way too much.

09:19 - Just because they know you’re like grinding your teeth like, “This is a cool conversational demo show.

09:24 - What are you doing Kendra? Jeez. “ Sorry. Okay, so- >> Your words, not mine. Oh, God.

09:31 - >> Gosh, Kendra said the worst. So, I can generate or create unit tests, just the stubs really easily, but from the class or the method level.

09:43 - So, I already have a home controller test- >> That’s been in there for very long time.

09:46 - >> Yeah. So, I already have a home controller test class.

09:50 - But you know again, it’s easy to forget these things and we definitely get comments like, “How do I discover all of these cool things in Visual Studio?” We’re working on it. You just did an episode with Justin with his tip of the day thing. Right? >> Yeah.

10:03 - >> That’s another good way. Maybe I should get this in there.

10:05 - So, let’s say I already generated the tests for this class, and I just added a method, and I want to now create a stub for that method.

10:16 - I can also go ahead and append a generated test to a file that already exists.

10:22 - So, I’ll go ahead and do that. Now, it has my [inaudible] not implement an exception, and it just appended test to my method name.

10:29 - Super simple. You’re already snoring, it’s okay.

10:32 - >> No. I’m just thinking that it’d be nice to have an extension or setting that automatically creates the unit test for you when you create the method in the first place.

10:43 - >> Oh, I like that feedback. I’m going to file that on developer- I’m just kidding.

10:48 - >> Sure. >> I got you. So, the next thing I want to show you is IntelliTest.

10:55 - Let me show you what this project does really quickly. So, this is my- >> We did an episode on IntelliTest a couple of years ago, but I haven’t really heard that much about it since.

11:04 - >> Exactly, so we want to talk about it more because people ask me for better test generation, I’m like, “Have you checked out IntelliTest?” And they are like, “What’s that?” So, I’m like, “Gosh, I got to go on one of those cool Channel 9 shows. ” Do you know of any? >> No.

11:18 - >> So this is my Obscure Calculator. So, it’s taking normal measurements into obscure measurements, like days to fortnight, miles to furlongs, et cetera.

11:30 - So, pretty simple methods right now. So, IntelliTest wouldn’t generate very interesting tests for these methods.

11:42 - So, let’s look at a method that has a lot of branches in it.

11:46 - So, this is my Calculate Trust Method. This is from the old adage, “I only trust them, as far as I can throw them. ” >> Right.

11:53 - >> Right. Obviously, excellent demo code, but it does have a lot of logic branches in it.

12:00 - So, for every conditional branching code, a case analysis performed and intellitized.

12:05 - So, if statements, assertions, operations, I can throw exceptions, all these are analyzed.

12:10 - This analysis is then used to generate test data for parameterized, unitized for each of your methods.

12:16 - This also gives you really high code coverage.

12:18 - So, I’m going to go ahead and right click and generate “IntelliTest. ” So, I’ll create my IntelliTest right here.

12:25 - >> On the X unit test project, or on the Obscure Calculator? >> I don’t think that’s selected.

12:32 - It’s going to generate a new test project in general for me.

12:35 - >> Okay. But does it matter what solution is highlighted when you right click? >> No, it matters where in the editor you right clicked from.

12:42 - >> Okay. >> So, I’m going to right click and create “IntelliTest. ” So, I want to put this on a new tasked project, so I will call it my generated project.

12:58 - It will go ahead and run that analysis right now.

13:03 - So, now you can see that it generated a. CS file, but it is actually when I run IntelliTest will generate more. G. CS files, and those are all of our generated classes.

13:15 - So, I’ll go ahead and do that. >> So, that’s going to run the tests that you created through IntelliTest not your entire suite of both IntelliTest, Unittests, and other Unittests? >> Correct. I can still use the Test Explorer to do that, but yeah, right now it’s definitely just focusing in on the IntelliTest.

13:39 - You can actually see in the Test Explorer, I now have all of those tests that it just generated for me.

13:46 - You can see they’re randomly generated names with exception numbering after it.

13:53 - >> Right. >> So, you can see in my solution Explorer that I now have that. G. CS file, and this is where all of this test cases live.

14:03 - So, the test. data for this is generated every time I run IntelliTest, so I don’t when I actually spend my time editing any of these files, because they’ll be overwritten when I rerun it.

14:15 - >> Created every time you run. >> Yeah.

14:17 - >> Okay. >> Yeah. So. >> How’s the promise of that? >> Good. I’m not sure how often people will be regenerating everything, but you can rerun them without regenerating the test.

14:29 - >> Okay. >> Sorry. I don’t think I made that clear.

14:31 - Yeah, so you’ll see this. CS file is the higher node of the test suite, and these all rely on the Pex method, which would be from the Microsoft Pex Framework, which was developed by Microsoft research.

14:47 - >> Okay. >> So, let’s look at my results really quick.

14:50 - Looks like I have some divided by zero exception, some no reference exceptions.

14:55 - I have some problems with that code. Luckily, I have a handy dandy code snippet, because I’m a cheater. That’s okay, right? >> You aren’t cheating if you’ve already written it.

15:08 - >> You don’t need to watch me throw out all of that stuff.

15:11 - This is basically just adding an old check and making sure that I’m not going to divide by the projectile person’s weight as long it’s zero.

15:21 - So, now if I rerun those tests, and actually before I rerun I do want to point out, I have nine tests here right now, seven of which are failing.

15:33 - I’ll go ahead and rerun them. So, IntelliTest is looking over my logic branches again.

15:44 - Since I don’t have as many logic branches or cases that it shows would cause a divide by zero error or something like that, you can see all my tests are passing now but I also only have seven because they change the conditions that were generating the tests to begin with.

16:02 - >> Interesting. >> Pretty sweet. Yeah. So, that’s basically IntelliTest.

16:09 - IntelliTest also provides great code coverage, so it’s an easy way to check that box.

16:15 - >> It would seem also to be a great learning tool to learn how to write Unittest and what should be in Unittest.

16:22 - >> That’s a very good point. Yeah. So it kind of takes maximum values, and just use cases and certain exceptions you would throw figures that what is most likely to be seen in this scenario.

16:40 - >> Right. >> So, I’ll go ahead and run code coverage and Visual Studio, that was just in test analyze code coverage, all I selected tests.

16:49 - I’m not doing too great, but let’s look at specifically the Conversion Calculator which is what I just generated the test for, and it’s not 100 percent because it looked at the entire method as well as multiple blocks within that method.

17:07 - >> Okay, so the ones that you have low numbers for were not the ones you created with IntelliTest? >> No. I haven’t run those over the other calculate fortnight, furlong.

17:19 - >> Right. And the one that IntelliTest created would have much better coverage than zero? >> Yeah.

17:24 - >> Okay, good. >> That was 100. It’s was great.

17:27 - Yeah, so it’s a good way to bump up your code coverage score. Very cool.

17:32 - So, if you want to get code coverage results in VSTS, that’s actually really simple to do.

17:39 - Just go to your “Build Definition”, so you can go to build and release and you can hit this “Code coverage enabled button”, and then it will run code coverage for you.

17:57 - >> Okay. >> It’ll be a part of your report that you see on that build.

18:01 - >> So, that’s not relying on the IntelliTest, right? Or is it? >> No. The code coverages is a different tool, that the IntelliTest would help improve your code coverage score.

18:14 - >> Okay. >> For sure. >> Okay. So, let’s just stay- >> The point here is that the code coverage you get in Visual Studio in local development, you can also see in VSTS as part of your pipeline.

18:27 - >> Okay. >> Yeah. >> Cool. >> Cool. So, one thing I also want to call out in VSTS is this newly added option; it’s running only the impacted tests.

18:37 - So, what are impacted tests? VSTS is actually able to look at your comments, and what code was actually changed, and figure out which tests were affected by those code changes and only run those tests.

18:49 - >> Okay. >> So, if you’ve only changed like four files, and maybe like 30 tests were affected, you don’t need to run all 5,000, 86,000 of your tests.

19:01 - So, it can save a lot of build time. >> Okay.

19:04 - >> Really nice feature. >> Cool. >> So, speaking of only impacted tests.

19:08 - >> Yes. >> Let’s talk about live in unit testing.

19:10 - >> Let’s. >> That’s the last feature I want to talk about.

19:14 - Okay. So, if you haven’t heard, Live Unit Testing listens to your code changes and runs impacted tests in the background as you work.

19:22 - So, test results are shown right in the code editor, right beside your code, in line-by-line feedback.

19:30 - So, this is Enterprise only feature, but the recent improvements that we’ve checked in are better performance and easier configuration.

19:39 - So, if you had issues opening your project in the past, with Live Unit Testing, >> That’s was always pretty easy- >> Oh, that’s fantastic. Yeah.

19:50 - >> But I’m sure there were issues people were running into.

19:53 - >> Yeah. I can share internally, we have customers in Office who have odd project titles.

19:59 - Well, don’t tell them I said that. But they had configuration issues and Live Unit Testing is just a lot smarter now.

20:07 - It can easily drop in the files that they need.

20:10 - So, I asked them to retry it, because they hadn’t tried it out in a couple months, and it just worked.

20:15 - >> Cool. >> Which is exactly the experience that we want.

20:18 - So, I’d highly suggest just trying it out again if you have ever had any issues in the past.

20:25 - So, it now supports MSTest V1 and. Net Core.

20:28 - >> Okay. >> We also added a test sender notification, which just gives more feedback on what Live Unit Testing is doing in the background, as well as a skip category.

20:38 - You can include and exclude test projects, and we now have test method icons so they pop out a little bit better.

20:47 - Let me show you what all that means though. Enough talk.

20:52 - Okay. So, I actually have a very large test project that’s almost 5,000 test.

20:58 - So, I don’t want to include it when I start live unit testing right off the bat.

21:03 - I only want to include a certain test project.

21:06 - I can now go to the Solution Explorer, right click and only include that.

21:11 - So, as you can see, my large test project isn’t running in the background, it didn’t try to re-execute or anything, super helpful.

21:19 - Another thing I called out earlier is, sorry, is the chunk limit, sorry, the skipped category.

21:28 - >> Yeah. >> There we go. So, my chocolate sentiment test, long story of why it’s named that is basically using Azure Cognitive Services to analyze the comments that a guest left in our Hotel 360 app, and if it was really negative, we’d ask housekeeping to leave a few more chocolates on their pillow to sweeten the deal.

21:50 - But, since this is Azure Cognitive Services, I didn’t want that test running every single time I made a code at it because that’s way too often.

21:58 - >> You didn’t feel like- >> I could probably lock out the door.

22:00 - >> -doubling it out and make doing a mock either.

22:02 - >> Right. >> So, you can just say, “Don’t run it. ” >>Yeah.

22:04 - >> Okay. >> I can just add the test coding category, skip the live unit testing, and now I have a little empty beaker instead of the usual- >> That’s cool, so, now you just- >> -beaker at test method I [inaudible].

22:15 - >> Okay. So, you don’t have to go to that and explicitly exclude that, you can just say, “Always skip it. ” >> Exactly.

22:21 - >> Cool. >> Okay. So, I’ll go ahead and show you how live unit testing works really quick.

22:30 - Let’s say, I have a few failing tests, I can click on “Icon and Editor”, I can hover over the test that’s failing and actually read the error message.

22:39 - If I click on it, I can actually debug this test to learn more about why I’m getting a null reference though I’m pretty sure it’s this one stream message that I’m using.

22:52 - So, I can go ahead and add, yeah, messages and all.

22:56 - So, I’ll go ahead and add a No check for that, and I can do that using our handy dandy code fix for it, and, of course, I can highlight and drag it where I want, and I will do that, just clean this up a little bit.

23:16 - Let’s only run message to that Normalize if message is not null, and you can see in the background while I was editing live unit testing who’s re-running these tests when I typed.

23:27 - So, now I can see that all things are passing and I feel way better.

23:31 - >> Cool, and then, of course, you can turn it off for that method while you’re writing it.

23:37 - >> I could, yeah. I could have added a skip category right here.

23:42 - >> You can also write, you can right-click and do it as well.

23:46 - >> No, the right-clicking was for excluding certain projects. So, the method level, we have categories, so you don’t lose track of them.

23:55 - But, for projects, is very much bigger blocks, so we just have right-click in the Solution Explorer.

24:00 - >> Got it. >> We want to be able to better navigate what tests are in or not a part of live unit testing, maybe with a new group by in the Test Explorer, but we’re working on it.

24:11 - >> Okay. >> Yeah. Cool. So, those are testing improvements, they shared new resources for learning why we should be testing, we talked about teletest, code coverage, and live unit testing.

24:24 - >> Sweet. >> Now, my life is happy.

24:27 - >> So, let me make it more, let me make it difficult.

24:30 - >> Oh, okay. >> So, we had, we had talked about Intellicode.

24:34 - >> Yes. >> Which is the AI inside Visual Studio.

24:38 - So, one could imagine a world in the hopefully not too distant future where as you are writing code, Visual Studio is writing your complete set of unit tests for you. Is that something? >> There is something that I could definitely imagine.

24:55 - >> Is it something? Okay. >> I think we’d still want because I think the organization of tests within test projects is really important to people because they probably already have a way of like even when I was right-clicking and generating a test methods that that would ask me, “What project do you want us to put that in and what class? I think that aspect is really important and I’m not sure if we’re ready to decide how everyone’s architecting their test project solutions.

25:20 - >> So, if I have a choice between doing all that myself or having Visual Studio do it for me, and then I’m not that crazy about the test type project hierarchy, is this a pretty small price to pay? >> Oh, you think, yeah.

25:35 - >> I think. >> Gosh, trying to please everyone.

25:38 - That’s the real gotcha. Yeah, we’re definitely taking a look at how to make test generation a lot easier because that is always a top task in the testing space.

25:50 - >> Right. >> So, I’d love to incorporate more Intellicode like features and actually use machine learning that because IntelliCode is a lot different from IntelliTest, in that, IntelliCode looked at 2,000 open-source. NET repositories that were out in the world.

26:08 - IntelliTest is just more of a logical analysis of what cases you might hit and what would be good test data to plug in.

26:18 - >> Right. >> But, if we took both of those and combine them, I probably get a permission.

26:23 - >> Like I test mesh it from some string message, right? >> Yeah.

26:27 - >> Right then and there, Visual Studio’s, “Oh, well I wonder what happens if the message is No, Oh, I wonder what happens if, whatever. ” There’s a couple thing, I mean IntelliTest is doing that, right? >> Yeah.

26:39 - >> In one big pass when I run it, I’m just thinking that it would be cool if you had that kind of going on at the same time.

26:49 - >> I agree. >> In a future version.

26:51 - >> Keep working on it. Stay tuned for Visual Studio 2019. Yes.

26:57 - >> That’s not a promise though. >> No.

26:59 - >> All right. >> Did it sound like a promise? >> No, it didn’t.

27:02 - >> I can’t make promises. I’m just a PM, guys.

27:05 - >> Cool, it’s a cool stuff. >> Thanks.

27:08 - >> Again, all that stuff is shipping today.

27:11 - >> Yeah, all of that stuff [inaudible]. >> Or additional handstands that we might see in 15. 8, 15. 9.

27:15 - >> Oh, I did not prepare any future work looking stuff.

27:19 - Yeah, we’re thinking of, we’re always thinking about better Test Explorer design.

27:24 - >> Okay. >> So, stay vague about it.

27:27 - >> Okay. Cool. >> But, yeah, there’s a lot of asks that we’ve gotten especially targeting multiple frameworks and how the Test Explorer handles them today is not ideal.

27:41 - >> Okay. >> So, that’s a popular ask.

27:44 - So, getting a new group by that is by multi TFM or something like that could be really helpful.

27:52 - All things, we’re thinking about it, no promises.

27:54 - >> Okay. Then, what’s the state of of how this works with. NET Framework versus. NET Core? what about potentially other languages you might be using? >> Yeah, a top ask is for making IntelliTest work for. NET Core because they did mention it’s only for. NET Framework right now.

28:11 - That’s definitely something we’re thinking about in the 2019 timeframe.

28:16 - >> Okay. All right. >> So, no plea.

28:19 - >> Okay. Cool. >> Well, I’ll keep you posted.

28:22 - >> I’ll have you back when there’s something to show for sure.

28:25 - >> Yeah. >> Thanks for doing this. >> Thanks, yeah, this is fun. Thanks for having me.

28:28 - >> I hope you enjoyed that and we will see you next time on Visual Studio Toolbox. .