Building data-driven web apps with Flask and SQLAlchemy Transcripts
Chapter: Testing web apps
Lecture: Pareto principle and testing with sitemaps
Login or
purchase this course
to watch this video and the rest of the course contents.
0:00
Let's look at one more thing
0:01
that will catch a ton or errors for us and
0:03
it's something you want to have anyway.
0:06
That's a site map.
0:07
So if we just run our application
0:09
and pull it up over here
0:11
I've now added a site map.
0:13
As I mentioned at the opening, site maps
0:16
are here to talk to search engines.
0:18
Say here are all the pages I would
0:20
like you to search and discover on our site.
0:23
And some of those are static
0:24
like here's the home page, here's an account login
0:26
and account register and then there's
0:28
all the data driven stuff.
0:30
Here's the AMPQ project and apters and argparse
0:33
and all you know you would have all of them.
0:36
On the real pypi.org you would have 140, 160
0:40
whatever the number is now
0:42
thousand packages listed here.
0:45
So this is something you may want to cache
0:46
somehow, right.
0:47
This could be kind of intense to generate this
0:50
but none the less if it exists and you want
0:52
it to exist so that you can use it for search engines
0:55
we can use it for testing. And the idea is that
0:57
if we just request, say, this
1:00
if that page comes up, there's a good
1:02
chance that everything worked.
1:04
If there's a problem, there's a good
1:06
chance that this is going to result in
1:08
a crash 500 error so on.
1:10
So by simply just going through and requesting
1:12
every URL on here, we're doing sort of a smoke test.
1:16
And it turns out a lot of times
1:17
web apps break hard, not soft right.
1:19
If somethings wrong its not a little bit wrong
1:22
it's BOOM you know.
1:23
None type does not have this attribute
1:25
type of crashes, things like that.
1:27
So were going to go and use that for our test.
1:29
Now let me just show you real quick.
1:30
I just added these in here so that
1:33
you don't have to go and generate them.
1:36
So here's a simple way to do that
1:37
we'll create a site map and remodel.
1:41
Its going to come in here and get a
1:43
just a call all packages.
1:44
I've passed the limit, in reality
1:46
you probably don't want to that
1:47
but just I don't want it to go crazy
1:49
if you have too much data.
1:50
So anyway, we're passing in this limit here.
1:53
I could probably make the updated text a little bit better.
1:57
There we go. So this is just going to be telling
1:59
part of site map has to talk about when it was last updated.
2:02
So um, we can figure out what
2:04
would a reasonable value be there. But
2:06
this is just going to be a fallback text
2:08
just for simple version, we're not actually
2:10
updating the data. So we'll get our packages
2:11
back and we're just going to feed it through
2:13
a template, over here, like so
2:17
let's go in and just interrate over
2:19
all the packages and generate them as well
2:21
as have the base static files.
2:24
All right. So with all of this in place
2:27
we can go write some tests against it.
2:29
Let me just show you that.
2:30
We're not going to write them from scratch
2:31
we'll just have a look.
2:32
Over here in our in our test we now have
2:34
site map tests. And what we can do
2:36
is we can come in, and say
2:39
let's just test this site map URL.
2:41
First we're going to get the text of the site map.
2:44
We're using the integration style here and
2:47
we're even letting this one hit the database.
2:48
Because we actually want the data to drive
2:51
what the packages are, for example.
2:54
And then we're going to use the XML features
2:56
in Python to do an x-path query to find
3:00
all the locations, this is going to be all the URL's.
3:03
Actually we want to request a relative path
3:05
so we're going to do a little replace on them here
3:08
and then we're going to get our URL's
3:11
and finally we're going to just loop over every URL
3:14
and just call client.get.
3:16
Now do we need, we have 140 thousand packages
3:19
do we need to call that function, that that view
3:21
140 thousand times? Probably not, if it's totally
3:24
broken it's probably going to crash for most of them.
3:26
So what we do is, we say we're actually going to
3:29
only request one project
3:32
and then we're going to bail out.
3:33
So if you've got like say a thousand categories
3:35
You might just only get one category.
3:37
You've got a thousand books if your a bookstore
3:40
only request one book. Things like that to kind of
3:42
speed it up. In reality, to get the site map text
3:45
is super easy we just do a get against the thing
3:48
you just saw. But we do a quick text replace
3:51
on the name space, I think Exemel names spaces
3:54
Suck and it makes the the x-path queries
3:57
up here harder so we can just drop that before
3:59
we get back the text, okay. And that's it.
4:02
I've already added this over to our _all_tests here
4:06
so when we run our _all_tests we should see
4:10
down here, that, that's running. Right there.
4:14
So see we tested /account/login, /account/register
4:18
and an AMPQ. That's because I told it to bail out
4:21
and not hit all the other packages.
4:24
Well that's it for testing.
4:25
You saw that we have three main categories of testing
4:27
in our web apps and of course there's others
4:29
as we also noted in the more prod unit test world.
4:34
But testing your web apps is important.
4:36
If your not going to do any testing
4:38
I encourage you to at least do the site map testing
4:40
it's going to actually catch a lot of the
4:42
errors that you would run into.