@@attila2246 Me: Hey, I just created a new button component. Pls review. Me: OK, but you didn't add any unit tests. Me: uhhh yeah, but... when I opened the browser and clicked it, it did the thing. Me: ...........eh, good enough for me **merges PR**
@@StEvUgnIn That is just not true. Both WebdriverIO and Protractor were built for testing purposes. While Selenium might just be a tool for browser automation, it has seen wide use for testing purposes as well.
@@StEvUgnIn You’re not wrong that it can be used for scraping. Any E2E tool would do the trick well. It’s primary purpose thing is testing. Puppeteer is more what you’re thinking of for scraping.
Cypress is pretty fun, but sometimes really tricky. The funniest part of it for me was when I had to do conditional testing, and I was new to Cypress. I relied on the docs and I found a section for conditional testing. It states: "don't worry, there are ways you can do with conditional testing! for example, you can... remove the need to do conditional testing!" Thank you Cypress, very cool. PS: No, I couldn't do that
This is the first time I've ever responded to a RUclipsr request ever in the decade of watching RUclips videos but yes, I would like to see more algorithm videos. Excellent explanation of the search. This feels weird. Great work on everything you post.
Been using cypress for 3 years after using selenium for god knows how long. I highly recommend this for TDD, your feedback cycle is almost immediate, you aren't coupled to chrome/driver versions, it's altogether the best way to write your integration tests first, see them not work, then repeatedly do the next thing it said didn't work. Simple.
Absolutely love your videos. I have been using Cypress for over a year now and I don't want to go back to those Protactor, Selenium stuff. Also, Cypress has something called `data-cy`, which is added to the elements that you want to loop up in your tests. `data-cy` parameter can have a unique name and enables the test to directly find the element in the dom. This is an amazing feature that we use everyday and avoid looking up using html and css tags as they can change.
That, and, so much of Cypress bugs me. Its Promises are not actual native browser Promises and can't be awaited. The magic strings for assertions. And if I wanted to see how many rows a table has, then submit a form and check if that table now has count + 1 rows, Cypress seems to actively hinder me. I found Playwright much more intuitive, friendly and robust. The only thing I really liked about Cypress was its execution window where you could "time travel" as Jeff says.
@@JPeetjuh The promises thing is super annoying, and agree that the magic strings are not my favorite way of doing assertions. Even though it has a promises-like API, Cypress is actually a command queue, not a promise chain. The use of promise-like syntax (and especially the docs trying to say it's promise-based) is very misleading, 100%.
Thank you for the quick video. I am on a different team temporarily and this helps me better understand the purpose since I have mostly written backend code.
From my experience using Cypress, I can see it really makes testing fun. For me, the fun part is watching Cypress run the test and everything passes. Definitely give it a try if you haven’t. Might end up loving it
I've been avoiding learning testing for years just because it was so boring for me. Even when I sat down with myself and asked myself what technologies I should learn to become a better well-rounded full-stack developer, testing was in there, but was always the last one I wanted to do. So I learned a few technologies, but never picked up testing. But this framework makes me actually want to learn it, seems so cool!
@@galgrunfeld9954 I ran away from testing for so long until I started seeing the importance. Especially working with a team with constant update, testing would catch a lot of bugs before it gets to staging or production. These frameworks have made it enjoyable so that’s a bonus. Funny thing, I’m the one now rooting for testing
@@joshuaokoro9447 yeah, I'm very much aware of the benefits. Luckily, or maybe not, I so far worked only in small teams and did a lot of things independently so TDD wasn't much of a necessity, but I can definitely see it being crucial in so many places.
I’d love one of these videos for playwright! I tried cypress and while it was really cool (especially with the test runner) it felt a bit dated imo. The lack of native promises really hurt my experience.
It's funny how I watch these videos once and I'm like "that's neat" then a month later I'm like "wait if I actually used that it could absolutely transform my development workflow!"
This content is always awesome. I am always curious how you can manage so many different techs, do you have experience using them throughout your career? Or do you just learn it like 1 week and make a video of it? or how? I am always amazed by how you deliver your content.
I really like using Playwright, but it just doesn't work in CI for more than a week before something explodes and it stops building I should look into putting it into a docker container
Cypress's coming support for cross-domain communication (and the Sessions API) should make auth a lot less painful. Of course, "It's coming" is not the most useful answer. ^^;;
Isn’t that just rendered html on the server? He definitely covered many frameworks that focus on that like nextjs. HTML over the wire has never stopped being a thing really.
This video got me into cypress, pretty f-n dope. I still need testing for Electron tho so I'm using Playwright since Spectron just got deprecated. Need to decide if I should switch from Mocha to Playwright Test as my Electron test runner.
Though reading these comments maybe the right choice is to go full on playwright. I'm still investigating. I do like how cypress works but obviously a lot of the pain points I hit already are a common thread.
Currently trying to decide between Cypress and Playwright for e2e testing on a large project at my job. What's the chance you have a playwright video on the way? :) Great stuff as always.
I've been waiting for this video. The automatic loading feature doesn't always work properly (doesn't work for XHR requests). But It's 100x better than Selenium. Highly recommended.
I tend to use puppeteer for everything, and I've used cypress, but what exactly are the advantages over puppeteer for testing? Is it the structure/interface and framework? Can/should I use both together?
Biggest advantage over puppeteer is the builtin retries / waiting for the page to settle. No more explicit need to wait for a loading spinner to be gone - just assert the content is there, and Cypress will retry until it is or until the command times out. This sort of functionality is built into basically every command. It's amazing the amount of "just works" you can get out of that.
@@threewestwinds there are different meanings of a page having settled (DOMContentLoaded event? network idle?) , and puppeteer has them all covered. Messy wait techniques are why I quit using selenium, but that's not something puppeteer lacks at all
@@travispulley5288 By "page to settle'" I don't just mean during page load events - I mean every command you issue, which causes rerenders as data loads in, spinners, animations, outgoing requests. Using Cypress you usually don't even need to *think* about waiting at all. I just assert or act on the desired end state. You can click on buttons that don't exist yet, and Cypress will wait until the button exists and then click on it. It's been a couple years since I used Puppeteer. But this was the biggest benefit for me. No 'filler' commands (like "wait for element to exist, then click on it"). You just say what you want. Less code, less mental effort.
@@threewestwinds pptr has all these wait styles baked into everything. If you're trying to interact with an element that's not present, it's helpful to know that it's not present and to treat that as an error (and/or wait for the implicit timeout). Even with my lack of Cypress experience, I know you'll just end up waiting for the max timeout duration in those cases anyways if the element never appears. What I'm getting from this is that they both do the same thing, but cypress has a friendlier companion UI? I need to do more research.
I'm trying my hardest to dig myself out of tutorial hell but you keep making these awesome videos that make me want to dig myself deeper. Fireship is not good during tutorial rehab.
I like Cypress, it really does work like a charm. One thing to note is that the Electron runtime is bundled / baked in, which arguably is pretty stupid. There is no way to install Cypress headless, even though most people use a real browser to run tests.
> There is no way to install Cypress headless I was wondering how I might use it to do my automated testing in gitlab-ci. The docs mention being able to do this, though.
@@DaraulHarris Cy can absolutely run in CI. Doing an npm install also downloads the cypress binary, which is fairly large, and comes with electron baked in.
There is headless mode, though Electron included no matter what. The "slim" docker CI image is roughly 600 mb. To be fair this includes Chrome and FF also.
If I was to create a small (small-medium) single-page app in React, would Cypress be a good choice? Or is it better to stick to Jest, since it comes ready with create-react-app. If I had to pick one. I might play around with this later, UI tests feel more accurate to what user actually experiences. But pre-build Jest is like there already, so it's easy.
@@ChemistTea No, but if you had a node back end to interact with, then Jest would be a good way to test any complexity. On the front end if you are testing multi-page processes then Cypress will shine. Like if your user first does a sign up, then a login,, then some interactions, then a log out, Cypress can test that process end-to-end.
Is it realy a legit way to do tdd and replace unit tests on frontends? So there would be a unit test and e2e test section in your cypress folder? I somehow like the idea but it doesnt feel natural 😂
Is a junior dev expected to know testing for their 1st job? Also does Cypress use Jest? Or does Cypress just have similar syntax? I've been learning Unit testing recently with Jest and Enzyme / React Testing Library, so just curious.
No you don’t. You will learn it with time. But knowing the basic and the theory is a plus. I know a lot of experimented devs who don’t do front end tests…
I'll add it to my list of the 8 trillion Javascript tools and frameworks I still need to evaluate lol Jokes aside I will probably check this out first since it actually looks super useful
My only problem with Cypress is that it doesn't support native JavaScript promises and async-await, it uses an old (and I think deprecated) library called Bluebird and you have to adapt to it, it has a different functionality of how you think promises work and your test code can be subject of a never ending chain-hell if you need values from a previous command.
Yeah. Cypress commands aren't promises, despite the syntax similarities (and the documentation's occasional attempts to refer to them as such) - you can't await them and they don't return values. They're commands you pass into a queue, to be executed later. It's not the most intuitive thing, I agree, but it works fairly well once you start thinking of it that way.
Do a video of cucumber bdd integrated with cypress. This brings the three amigos together and speak the same language. Let me know if you’d like some insight as to why this approach is amazing.
Ah yes, automated UI testing. That thing I'm definitely absolutely positively going to start doing... one of these days.
I have never seen a comment I relate more with.
I basically exclusively test network calls using cypress these days. Powerful framework.
Meet converted pyramid, tapes server and unit size discovery.
So all your PR's get accepted with 0 unit tests?
@@attila2246
Me: Hey, I just created a new button component. Pls review.
Me: OK, but you didn't add any unit tests.
Me: uhhh yeah, but... when I opened the browser and clicked it, it did the thing.
Me: ...........eh, good enough for me **merges PR**
Been using Cypress for a year. Absolute game-changer over Selenium, webdriverio, and protractor.
Those tools are not for testing but for scraping
have you ever looked into Playwright? if so, what are your thoughts?
@@StEvUgnIn That is just not true.
Both WebdriverIO and Protractor were built for testing purposes. While Selenium might just be a tool for browser automation, it has seen wide use for testing purposes as well.
@@StEvUgnIn You’re not wrong that it can be used for scraping. Any E2E tool would do the trick well. It’s primary purpose thing is testing. Puppeteer is more what you’re thinking of for scraping.
So if I am still using selenium, you would recommend me to change to cypress? ;-)
I don’t even do web development but these videos are just too entertaining
Can confirm, I’ve been sucked in.
It's interesting that for someone it's entertainment but for others it's boring af
Same.
Suggestions for 100 second tuts:
- Oauth2/OpenID Connect
- Swagger/OpenAPI 3
- Logging/Monitoring
- Caching solutions
- Phaser 3
SAML?
julia
GSAP too
WebRTC
Lisp
Cypress is pretty fun, but sometimes really tricky.
The funniest part of it for me was when I had to do conditional testing, and I was new to Cypress. I relied on the docs and I found a section for conditional testing. It states:
"don't worry, there are ways you can do with conditional testing! for example, you can... remove the need to do conditional testing!"
Thank you Cypress, very cool.
PS: No, I couldn't do that
I have to say it again: your „video-editing“ and „story-telling“ skill is OUT of this world 😄
Thank you so much for your work 🙏
I will almost certainly never use this, but the clarity and quality of your videos is so outstanding that I can’t get enough. Thanks!
Cypress is awesome! I've spent more time debugging the jest config than testing the code base !
Thank you Jeff for another amazing 100-second tutorial. Anytime Jeff explains a concept, it becomes easier and more approachable for me.
This is the first time I've ever responded to a RUclipsr request ever in the decade of watching RUclips videos but yes, I would like to see more algorithm videos. Excellent explanation of the search. This feels weird. Great work on everything you post.
Been using cypress for 3 years after using selenium for god knows how long. I highly recommend this for TDD, your feedback cycle is almost immediate, you aren't coupled to chrome/driver versions, it's altogether the best way to write your integration tests first, see them not work, then repeatedly do the next thing it said didn't work. Simple.
Did you solve the lack of support of iFrame and multitab from Cypress?
Absolutely love your videos.
I have been using Cypress for over a year now and I don't want to go back to those Protactor, Selenium stuff.
Also, Cypress has something called `data-cy`, which is added to the elements that you want to loop up in your tests. `data-cy` parameter can have a unique name and enables the test to directly find the element in the dom. This is an amazing feature that we use everyday and avoid looking up using html and css tags as they can change.
Cypress is seriously such a game changer
For me, I moved from Cypress to Playwright. It's much faster and can do almost everything Cypress can!
That, and, so much of Cypress bugs me. Its Promises are not actual native browser Promises and can't be awaited. The magic strings for assertions. And if I wanted to see how many rows a table has, then submit a form and check if that table now has count + 1 rows, Cypress seems to actively hinder me. I found Playwright much more intuitive, friendly and robust. The only thing I really liked about Cypress was its execution window where you could "time travel" as Jeff says.
@@JPeetjuh The promises thing is super annoying, and agree that the magic strings are not my favorite way of doing assertions.
Even though it has a promises-like API, Cypress is actually a command queue, not a promise chain. The use of promise-like syntax (and especially the docs trying to say it's promise-based) is very misleading, 100%.
The cross domain restrictions and local single threading are also pretty annoying.
is it free and can run locally? genuine question, no bias or fan boy thing.
Good thing about using these tools is that it also helps you to narrow down use-case of the application you make and only implement essentials.
I've literally started working with cypress for our application at work this morning. Awesome timing as usual
the line "to figure out precisely why your code sucks" is so hilarious to me
😁
I’m a big cypress advocate. Absolute game changer!
I just started testing with Cypress this year, it's been real cool to use. Thanks for the videos as always!
How's it going so far man?
Litteraly started learning Cypress yesterday, its so amazing for testing
Thank you for the quick video. I am on a different team temporarily and this helps me better understand the purpose since I have mostly written backend code.
You forgot to add the part about nobody ever maintaining the tests
Starting into web development is great especially when you are able to enjoy such amazing content
Been using cypress for 4 years. It's incredibly powerful and I love it.
From my experience using Cypress, I can see it really makes testing fun. For me, the fun part is watching Cypress run the test and everything passes. Definitely give it a try if you haven’t. Might end up loving it
I've been avoiding learning testing for years just because it was so boring for me. Even when I sat down with myself and asked myself what technologies I should learn to become a better well-rounded full-stack developer, testing was in there, but was always the last one I wanted to do.
So I learned a few technologies, but never picked up testing. But this framework makes me actually want to learn it, seems so cool!
@@galgrunfeld9954 I ran away from testing for so long until I started seeing the importance. Especially working with a team with constant update, testing would catch a lot of bugs before it gets to staging or production. These frameworks have made it enjoyable so that’s a bonus. Funny thing, I’m the one now rooting for testing
@@joshuaokoro9447 yeah, I'm very much aware of the benefits. Luckily, or maybe not, I so far worked only in small teams and did a lot of things independently so TDD wasn't much of a necessity, but I can definitely see it being crucial in so many places.
This and TestCafe make E2E an absolute breeze for any web dev.
I had to make the choice of using testcafe over cypress for my company 3 years ago. Main reason was cypress didn't support safari, nor s.
100 Seconds video ideas:
- Backing up hard drive
- Wiping history
- Getting some RAM a few megabytes
- Logging in and logging out
Been using Cypress with TestingLibrary and MSW for a while and they are great for getting tests done fast.
I worked as an automation tester using Cypress, it was cool.
thanks for this one bro, I needed it
just what I needed! 🤩
If it were me, I wouldn't use it for unit or integration tests. But it's amazing for UI or E2E tests
I’d love one of these videos for playwright! I tried cypress and while it was really cool (especially with the test runner) it felt a bit dated imo. The lack of native promises really hurt my experience.
this channel is becoming very js oriented
Really cool. Planning to use it on my next side project.
Just started to write tests for my project, and see this today
I was about to launch my app to production without testing at the end of the week.. Thanks, that seems to be exactly what I need !
It's funny how I watch these videos once and I'm like "that's neat" then a month later I'm like "wait if I actually used that it could absolutely transform my development workflow!"
I've just experienced my first BSOD for a while , while watching this video. it makes sense now .
This content is always awesome. I am always curious how you can manage so many different techs, do you have experience using them throughout your career? Or do you just learn it like 1 week and make a video of it? or how? I am always amazed by how you deliver your content.
this is awesome, i didnt even know what cypress was 100 seconds ago
I prefer playwright over cypress, it's more robust though ofc looks less fancy than cypress.
What cypress killed for me is them not support any http/3
I really like using Playwright, but it just doesn't work in CI for more than a week before something explodes and it stops building
I should look into putting it into a docker container
Also left Cypress for Playwright, as getting our auth in all the tests was a nightmare in Cypress
Cypress's coming support for cross-domain communication (and the Sessions API) should make auth a lot less painful. Of course, "It's coming" is not the most useful answer. ^^;;
I like how it just isn't "if" or even "when" anymore but straight up "why your code sucks"
finally found what I needed. thanks Jeff !
I hear html over the wire is coming back, any news on that?
Isn’t that just rendered html on the server? He definitely covered many frameworks that focus on that like nextjs.
HTML over the wire has never stopped being a thing really.
Okay, I guess my company just made another decision and that is which testing tool to use for front-end. :D Thanks Jeff
We've ended up using playwright instead of cypress, had some problems with ts with cypress, and playwright setup was just smooth as butter
I really love cypress ❤️ Even now I have to use React, I feel save to delivery some quality 🙌🏻
I'm using Playwright. Amazing tool. Build a suite to test all our countries (work for a B2B supplier)
idk what a rails dev like me is watching this for but that looks cool
My bud who I work with is from Cyprus, he's going to go crazy after seeing this video...
Likely for both the name and what it does.
What are the advantages of something like Jest compared to Cypress?
This video got me into cypress, pretty f-n dope. I still need testing for Electron tho so I'm using Playwright since Spectron just got deprecated. Need to decide if I should switch from Mocha to Playwright Test as my Electron test runner.
Though reading these comments maybe the right choice is to go full on playwright. I'm still investigating. I do like how cypress works but obviously a lot of the pain points I hit already are a common thread.
Currently trying to decide between Cypress and Playwright for e2e testing on a large project at my job. What's the chance you have a playwright video on the way? :) Great stuff as always.
I've been waiting for this video. The automatic loading feature doesn't always work properly (doesn't work for XHR requests). But It's 100x better than Selenium. Highly recommended.
Excellent video as always! And now that you are delving into test territory, how about a nice vitest in 100 seconds? I think its time!
Can you make a video about Data Oriented Programming and ECS (Entity Component Systems) ?
I tend to use puppeteer for everything, and I've used cypress, but what exactly are the advantages over puppeteer for testing? Is it the structure/interface and framework? Can/should I use both together?
Biggest advantage over puppeteer is the builtin retries / waiting for the page to settle. No more explicit need to wait for a loading spinner to be gone - just assert the content is there, and Cypress will retry until it is or until the command times out. This sort of functionality is built into basically every command. It's amazing the amount of "just works" you can get out of that.
@@threewestwinds there are different meanings of a page having settled (DOMContentLoaded event? network idle?) , and puppeteer has them all covered. Messy wait techniques are why I quit using selenium, but that's not something puppeteer lacks at all
@@travispulley5288 By "page to settle'" I don't just mean during page load events - I mean every command you issue, which causes rerenders as data loads in, spinners, animations, outgoing requests.
Using Cypress you usually don't even need to *think* about waiting at all. I just assert or act on the desired end state. You can click on buttons that don't exist yet, and Cypress will wait until the button exists and then click on it.
It's been a couple years since I used Puppeteer. But this was the biggest benefit for me. No 'filler' commands (like "wait for element to exist, then click on it"). You just say what you want. Less code, less mental effort.
@@threewestwinds pptr has all these wait styles baked into everything. If you're trying to interact with an element that's not present, it's helpful to know that it's not present and to treat that as an error (and/or wait for the implicit timeout). Even with my lack of Cypress experience, I know you'll just end up waiting for the max timeout duration in those cases anyways if the element never appears.
What I'm getting from this is that they both do the same thing, but cypress has a friendlier companion UI? I need to do more research.
0:35 precision is important in these matters.
I'd love to see a purescript video! Maybe even a beyond 100 seconds on it too.
Love your videos!
Nice! Does any of you Cypress pros know if it allows for checking the order or Redux actions in the Redux Chrome tab?
I'm trying my hardest to dig myself out of tutorial hell but you keep making these awesome videos that make me want to dig myself deeper. Fireship is not good during tutorial rehab.
Liking before watching 👍🏽
Can you do one on Cypress Hill next?
Helpful! Thank you so much❤️
I like Cypress, it really does work like a charm.
One thing to note is that the Electron runtime is bundled / baked in, which arguably is pretty stupid.
There is no way to install Cypress headless, even though most people use a real browser to run tests.
> There is no way to install Cypress headless
I was wondering how I might use it to do my automated testing in gitlab-ci. The docs mention being able to do this, though.
@@DaraulHarris Cy can absolutely run in CI. Doing an npm install also downloads the cypress binary, which is fairly large, and comes with electron baked in.
There is a headless mode for your tests 😉
There is headless mode, though Electron included no matter what.
The "slim" docker CI image is roughly 600 mb. To be fair this includes Chrome and FF also.
If I was to create a small (small-medium) single-page app in React, would Cypress be a good choice? Or is it better to stick to Jest, since it comes ready with create-react-app. If I had to pick one. I might play around with this later, UI tests feel more accurate to what user actually experiences. But pre-build Jest is like there already, so it's easy.
Cypress on the front end; Jest on the back end.
@@albirtarsha5370 Is React used in back end? I haven't heard of that.
@@ChemistTea No, but if you had a node back end to interact with, then Jest would be a good way to test any complexity. On the front end if you are testing multi-page processes then Cypress will shine. Like if your user first does a sign up, then a login,, then some interactions, then a log out, Cypress can test that process end-to-end.
@@ChemistTea Hes just blindly shouting his biases. Stick to whats in the box, its 99% the same and the 1% isn't likely worth the effort.
Fireship is a modern hero
good content, as always.
Was just looking at javascript testing! How do you always come up with timely content? Thanks again!
Is it realy a legit way to do tdd and replace unit tests on frontends? So there would be a unit test and e2e test section in your cypress folder? I somehow like the idea but it doesnt feel natural 😂
Is a junior dev expected to know testing for their 1st job? Also does Cypress use Jest? Or does Cypress just have similar syntax? I've been learning Unit testing recently with Jest and Enzyme / React Testing Library, so just curious.
No you don’t. You will learn it with time. But knowing the basic and the theory is a plus. I know a lot of experimented devs who don’t do front end tests…
Sir, waiting for more rust lang and golang videos 🙌
Same here
Rust and *elixir videos
More about cypress please and also about load testing of APIs
'Love Cypress, highly recommend
What a coincidence, I was learning Cypress right now already.
I enjoy your background classic. Where Can I found it?
"To figure out precisely why your code sucks..."
Lol! I feel called out for some reason.
great vid, obviously. but what folder/file icon theme is that?
My company would not have gotten testing done as quickly as we did without Cypress.
Thank you! Can you please do Julia next?
Would cypress be a good choice for angular projects, or is it better to use the included tester (karma)?
What is "javascript business logic" ? Where is it used? As a SW Dev I need to know?
I'll add it to my list of the 8 trillion Javascript tools and frameworks I still need to evaluate lol
Jokes aside I will probably check this out first since it actually looks super useful
My only problem with Cypress is that it doesn't support native JavaScript promises and async-await, it uses an old (and I think deprecated) library called Bluebird and you have to adapt to it, it has a different functionality of how you think promises work and your test code can be subject of a never ending chain-hell if you need values from a previous command.
Yeah. Cypress commands aren't promises, despite the syntax similarities (and the documentation's occasional attempts to refer to them as such) - you can't await them and they don't return values. They're commands you pass into a queue, to be executed later.
It's not the most intuitive thing, I agree, but it works fairly well once you start thinking of it that way.
what's the icon theme used? I've always wondered, cause it looks nice
Hi Jeff, can you do a tutorial on the AngularFire v7 SDK, especially around analytics. thanks
maybe do some more non-frontend-oriented stuff like neural networks (tensorflow, pytorch) or some other interesting stuff like a turing machine
does the project need to be written in javascript so that it is testable via cypress?
please give your vscode settings i love your theme and icons for files and folders
Theme: Atom One Dark
Font: Fira Code
Icon: Material Icons
Holy, thats so epic!
Here is a sincere suggestion, can you please do one on julia?
Are you fucking psychic, just needed this ❤️
Playwright is a great lowkey Cypress alternative.
Do a video of cucumber bdd integrated with cypress. This brings the three amigos together and speak the same language. Let me know if you’d like some insight as to why this approach is amazing.
Can we have Spark / Hadoop next please :)
Please make some videos on load testing tools
Hey, which tool you used to create these type of videos
awesome tool TY for this... btw i love to see fastApi in 100 seg