This article gives hands-on experience of writing basic utility procedures and creating their SQL unit tests using tSQLt an advanced SQL unit testing framework.

本文提供了使用高级SQL单元测试框架使用tSQLt编写基本实用程序和创建其SQL单元测试的动手经验。

The article also highlights the importance and application of utility procedures in day to day database report writing tasks.

本文还强调了实用程序在日常数据库报告编写任务中的重要性和应用。

Additionally, the readers of this article are going to learn some tips to meet common reporting requirements with the help of SQL utility procedures.

此外,本文的读者还将学习一些技巧,这些技巧可借助SQL实用程序来满足常见的报表要求。

There is a hidden challenge in this article as well for those SQL programming enthusiasts who would like to go beyond the basics to test their skills and learn more in this effort.

对于那些想超越基础知识来测试自己的技能并从中学到更多东西SQL编程爱好者来说,本文中也存在一个隐藏的挑战。

关于SQL Utility过程 (About SQL Utility procedures )

SQL utility procedures generally fall into two categories:

SQL实用程序过程通常分为两类:

  1. System utility procedures 系统实用程序
  2. User-defined utility procedures 用户定义的实用程序

系统实用程序 (System utility procedures)

System utility procedures are out of the box SQL procedures available with SQL Server which help in maintaining the good health of your system (SQL Server) and the entities (databases, SSIS Packages, etc.) of your system alongside providing meta-data (data about databases) to facilitate tracking, logging and error resolving.

系统实用程序过程是SQL Server随附的现成SQL过程,可帮助维护系统(SQL Server)和系统实体(数据库,SSIS包等)的良好运行状况,同时提供元数据(数据)关于数据库),以方便跟踪,记录日志和解决错误。

例 (Example)

Let us take an example of sp_databases system stored procedure which provides a list of all the databases belonging to SQL server instance or accessible via gateway according to Microsoft documentation.

让我们以sp_databases系统存储过程为例,该过程提供了属于SQL Server实例或根据Microsoft文档可通过网关访问的所有数据库的列表。

-- System stored procedure to show list of all the databases
EXEC sp_databases

The procedure returns the list of all the databases as follows:

该过程返回所有数据库的列表,如下所示:

A polite reminder for the beginners that the output may vary based on the databases created in the SQL server instance you are running this stored procedure against.

礼貌地提醒初学者,输出可能会根据运行该存储过程SQL Server实例中创建的数据库而有所不同。

Also, SQL unit testing a system utility procedure is not recommended at all since they already undergo a lot of testing before the product (Microsoft SQL Server) gets shipped.

另外,根本不建议对系统实用程序进行SQL单元测试,因为在产品(Microsoft SQL Server)出厂之前,它们已经进行了大量测试。

用户定义的实用程序 (User – defined utility procedure )

The user-written stored procedures to act as a utility are known as user defined utility procedures.

用户编写的充当实用程序的存储过程称为用户定义的实用程序。

In other words, any stored procedure written to facilitate another stored procedure can be called a utility procedure.

换句话说,为方便另一个存储过程而编写的任何存储过程都可以称为实用程序。

By utility procedures we mean the stored procedures which are specifically designed to facilitate business or system requirements generally by performing some functionality and handing over their output to another database object which then plays a major role in the overall database (requirement) picture.

实用程序是指专门用于通过执行某些功能并将其输出移交给另一个数据库对象(通常在整个数据库(需求)图中起主要作用)来满足业务或系统需求的存储过程。

例 (Example)

A good example is of creating a utility procedure to implement user-defined database logging process (as per requirements) which saves the details of the database user who adds a new record to the table.

一个很好的例子是创建一个实用程序过程来实现用户定义的数据库日志记录过程(根据要求),该过程将保存向表中添加新记录的数据库用户的详细信息。

Now the first procedure AddData inserts the data into the table while you also have to write a general LogInfo utility procedure which is going to insert the information of the user and the time when AddData procedure was called to insert new record.

现在,第一个过程AddData将数据插入表中,同时您还必须编写一个通用的LogInfo实用程序过程,该过程将插入用户的信息以及调用AddData过程插入新记录的时间。

创建实用程序 (Creating Utility Procedure )

In this section we are going to write a utility procedure based on business requirements.

在本节中,我们将根据业务需求编写实用程序。

Please remember to think about the utility procedure from the SQL unit testing perspective as well as we do in test-driven database development mentioned earlier.

请记住从SQL单元测试的角度来考虑实用程序过程,就像我们前面提到的在测试驱动的数据库开发中一样。

业务需求 (Business requirement )

A database report is desired to show complete weekly sales.

需要一个数据库报告来显示完整的每周销售。

初步分析 (Preliminary Analysis)

The database report to show weekly sales must require a utility procedure to output the start and end date for a weekly report based on the dynamic nature of the report.

显示每周销售量的数据库报告必须需要一个实用程序来根据报告的动态性质输出每周报告的开始和结束日期。

For example, if today is 25 July 2019 then the weekly report must show sales figures from 15 July 2019 up until 21 July 2019 because this is the most recent complete week and this is how professional reports are written and managed.

例如,如果今天是2019年7月25日,则周报表必须显示从2019年7月15日到2019年7月21日的销售数据,因为这是最近的完整一周,这是编写和管理专业报告的方式。

规划实用程序逻辑 (Planning utility procedure logic)

It is worth doing some mental exercise to define the logic of the utility procedure which is going to give us start and end date of the weekly sales report.

值得进行一些脑力锻炼来定义实用程序的逻辑,这将为我们提供每周销售报告的开始和结束日期。

The DateAdd() SQL function is highly recommended in this scenario which we are going to use to build this utility procedure.

在这种情况下,强烈建议使用DateAdd() SQL函数,该函数将用于构建此实用程序过程。

测试驱动的数据库开发 (Test-driven database development )

I highly recommend at this point to use a test-driven database development method to create your utility procedure which means your SQL unit testing is going to derive your database object definition.

在这一点上,我强烈建议您使用测试驱动的数据库开发方法来创建实用程序,这意味着您SQL单元测试将派生您的数据库对象定义。

Please refer to the article Fundamentals of Test-Driven Database Development (TDDD) with tSQLt unit testing to get more information about it.

请参阅带有tSQLt单元测试的测试驱动数据库开发(TDDD)的基础知识,以获取有关它的更多信息。

Since the focus of this article is not implementing test-driven database development so we are creating the utility procedure first bypassing test-driven database development.

由于本文的重点不是实现测试驱动的数据库开发,因此我们首先绕过测试驱动的数据库开发来创建实用程序。

创建样本数据库 (Creating a Sample Database)

Let us create and populate a sample database named ITSalvesV2 using the following T-SQL script:

让我们使用以下T-SQL脚本创建并填充一个名为ITSalvesV2的示例数据库:

CREATE DATABASE ITSalesV2;
GOUSE ITSalesV2
GO-- (1) Create DailySales table
CREATE TABLE [dbo].[DailySale] ([SaleId]      INT             IDENTITY (1, 1) NOT NULL,[SellingDate] DATETIME2 (7)   NULL,[Customer]    VARCHAR (50)    NULL,[Product]     VARCHAR (150)   NULL,[TotalPrice]  DECIMAL (10, 2) NULL, CONSTRAINT [PK_DailySale] PRIMARY KEY ([SaleId])
);-- (2) Insert data
SET IDENTITY_INSERT [dbo].[DailySale] ON
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (1, N'2019-07-15 00:00:00', N'Asif', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (2, N'2019-07-15 00:00:00', N'Mike', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (3, N'2019-07-16 00:00:00', N'Adil', N'Lenovo Laptop', CAST(350.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (4, N'2019-07-17 00:00:00', N'Sarah', N'HP Laptop', CAST(250.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (5, N'2019-07-17 00:00:00', N'Asif', N'Dell Desktop', CAST(200.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (6, N'2019-07-20 00:00:00', N'Sam', N'HP Desktop', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (7, N'2019-07-20 00:00:00', N'Mike', N'iPad', CAST(250.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (8, N'2019-07-21 00:00:00', N'Mike', N'iPad', CAST(250.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (9, N'2019-07-22 00:00:00', N'Peter', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[DailySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (10, N'2019-07-23 00:00:00', N'Peter', N'Asus Laptop', CAST(400.00 AS Decimal(10, 2)))
SET IDENTITY_INSERT [dbo].[DailySale] OFF

工作日名称和号码列表 (List of week day name and number )

As discussed earlier the utility procedure must make use of SQL built-in date time function to calculate the start and end of the last week.

如前所述,实用程序必须使用SQL内置的日期时间函数来计算上周的开始和结束。

Here, again SQL unit testing of the built-in date time function is not required unless you are using a user-defined function then its SQL unit testing must be planned but isolating it from other things.

在这里,再次不需要内置日期时间函数SQL单元测试,除非您使用的是用户定义的函数,则必须计划其SQL单元测试,但要将其与其他事物隔离开来。

Before we write utility procedure let us understand how the day of the week is represented in number according to the current date time settings in SQL Server.

在编写实用程序之前,让我们了解如何根据SQL Server中的当前日期时间设置以数字表示星期几。

-- List of name and number of the week day
DECLARE @DateTable TABLE (NameOfTheDay VARCHAR(30), NumberOfTheDay SMALLINT)
DECLARE @Date DATETIME
SET @Date='01 Apr 2019'
WHILE @DATE<'08 Apr 2019'
BEGIN
INSERT INTO @DateTable
SELECT (DATENAME(WEEKDAY,@Date)),(DATEPART(WEEKDAY,@DATE))
SET @Date=@Date+1
END
SELECT * FROM @DateTable

Running the above script shows us the following output:

运行上面的脚本向我们显示以下输出:

Well, the utility procedure we are going to write to get last week’s start and end date does not depend on the above information much but I am leaving a clue for the readers here to craft their own stored procedure based on the above logic.

好吧,我们要编写的用于获取上周开始和结束日期的实用程序并不完全依赖于上述信息,但是我为这里的读者提供了根据上述逻辑来设计自己的存储过程的线索。

编写实用程序 (Writing Utility Procedure)

We have to now write utility procedure in such a way that we should be able to assign weekly report start date as Last week’s Monday and end date as Last week’s Sunday

现在,我们必须以这样一种方式编写实用程序:我们应该能够将每周报告的开始日期指定为上周的星期一,将结束日期指定为上周的星期日

-- The utility procedure to calculate the last week's start and end date
CREATE PROC GetWeeklyReportStartEndDate
@CurrentDate DATETIME2
,@LastWeekStartDate DATETIME2 OUTPUT
,@LastWeekEndDate DATETIME2 OUTPUT
AS
BEGIN
SET NOCOUNT ONSET @LastWeekStartDate=DATEADD(DD,-7,@CurrentDate) -- Go back 7 days to get last week SELECT @LastWeekStartDate=
CASE DATENAME(DW,@LastWeekStartDate)
WHEN 'Monday' THEN @LastWeekStartDate -- If last week start is Monday then OK
WHEN 'Tuesday' THEN DATEADD(DD,-1,@LastWeekStartDate) -- If Tuesday go back 1 day to start from Monday
WHEN 'Wednesday' THEN DATEADD(DD,-2,@LastWeekStartDate) -- If Wednesday go back 2 days to start from Monday
WHEN 'Thursday' THEN DATEADD(DD,-3,@LastWeekStartDate) -- If Thursday go back 3 days to start from Monday
WHEN 'Friday' THEN DATEADD(DD,-4,@LastWeekStartDate) -- If Friday go back 4 days to start from Monday
WHEN 'Saturday' THEN DATEADD(DD,-5,@LastWeekStartDate) -- If Saturday go back 5 days to start from Monday
WHEN 'Sunday' THEN DATEADD(DD,-6,@LastWeekStartDate) -- If Sunday go back 5 days to start from Monday
END,@LastWeekEndDate=(DATEADD(DD,6,@LastWeekStartDate)) -- Move forward 6 days to get last weekend dateEND

测试运行实用程序 (Test running utility procedure )

After creating the utility procedure in the sample database we need to test run by running the following T-SQL script:

在示例数据库中创建了实用程序之后,我们需要通过运行以下T-SQL脚本来测试运行情况:

--(1) Call the utility procedure to get last week start and end date
DECLARE @StartDate DATETIME2, @EndDate DATETIME2,@TheDate DATETIME2
SET @TheDate='17 Jul 2019'
EXEC GetWeeklyReportStartEndDate @CurrentDate=@TheDate
,@LastWeekStartDate=@StartDate OUTPUT,
@LastWeekEndDate=@EndDate OUTPUT--(2) Show current date along with last week start date and end date
SELECT Format(@TheDate,'dd-MMM-yyyy') as CurrentDate,Format(@StartDate,'dd-MMM-yyyy') AS WeekStartDate,Format(@EndDate,'dd-MMM-yyyy') as WeekEndDate

The output is as follows:

输出如下:

报表主要程序中实用程序的使用 (Use of utility procedure in report main procedure)

Let us now quickly analyze how the utility procedure is used by the report procedure. The utility procedure we have created earlier can be used with any weekly report procedure.

现在让我们快速分析报告过程如何使用实用程序。 我们之前创建的实用程序可以与任何每周报告程序一起使用。

创建WeeklySalesReport过程 (Creating WeeklySalesReport procedure)

If we are to create a WeeklySalesReport procedure then the utility procedure GetWeeklyReportStartEndDate is going to return the start and end date of the last complete week and we can base our sales on these returned start and end dates (of the last complete week).

如果我们要创建WeeklySalesReport过程,则实用程序GetWeeklyReportStartEndDate将返回上一完整周的开始和结束日期,我们可以基于这些返回的开始和结束日期(最后一整周)来进行销售。

The stored procedure to show weekly sales can be written as follows:

显示每周销售量的存储过程可以编写如下:

-- The procedure to show weekly sales report
CREATE PROCEDURE [dbo].[ShowWeeklySales]
ASDECLARE @StartDate DATETIME2, @EndDate DATETIME2,@TheDate DATETIME2,@AfterEndDate DATETIME2SET @TheDate=GETDATE() -- get today's dateEXEC GetWeeklyReportStartEndDate @CurrentDate=@TheDate,@LastWeekStartDate=@StartDate OUTPUT,@LastWeekEndDate=@EndDate OUTPUTSET @AfterEndDate=DATEADD(DD,1,@EndDate)SELECT * FROM dbo.DailySale S WHERE S.SellingDate>=@StartDate and S.SellingDate<@AfterEndDateRETURN 0

SQL单元测试实用程序过程 (SQL Unit testing utility procedure )

Let us try to understand the answers to the following questions:

让我们尝试了解以下问题的答案:

在主报告程序中调用的实用程序如何进行单元测试? (How the utility procedure called within the main report procedure is unit tested?)

A utility procedure is just like any other stored procedure and its SQL unit testing is done in the same way as other procedures are unit tested.

实用程序过程就像任何其他存储过程一样,其SQL单元测试的执行方式与其他过程的单元测试相同。

应当首先对两种方法中的哪一种进行单元测试? (Which procedure out of the two should be unit tested first?)

Although the order does not matter much but the way the main procedure is unit tested is going to be slightly different than the SQL unit testing utility procedure.

尽管顺序无关紧要,但是对主过程进行单元测试的方式将与SQL单元测试实用程序略有不同。

When we write the SQL unit test for the main procedure we have to use utility procedure as a stub rather than actual procedure while there must be another SQL unit test to ensure that the utility procedure is working well and both SQL unit tests must pass.

当我们为主要过程编写SQL单元测试时,我们必须使用实用程序过程而不是实际过程,而必须使用另一个SQL单元测试来确保该实用程序运行良好并且两个SQL单元测试都必须通过。

设置tSQLt框架 (Setup tSQLt framework )

We assume that tSQLt has already been installed by downloading tSQLt and running tSQLt.class.sql script and ready to be used against the sample database ITSalesV2.

我们假定已经通过下载tSQLt并运行tSQLt.class.sql脚本安装了tSQLt,并准备将其用于示例数据库ITSalesV2

Please refer to the article Fundamentals of Test-Driven Database Development (TDDD) with tSQLt unit testing to get more information on how to setup the tSQLt unit testing framework.

请参考带有tSQLt单元测试的测试驱动数据库开发(TDDD)基础知识,以获得有关如何设置tSQLt单元测试框架的更多信息。

创建实用程序过程SQL单元测试类 (Create SQL unit test class for utility procedure)

Before we begin SQL unit testing the database object (utility procedure) we need to create a general test class called GetWeeklyReportStartEndDateTests in the sample database ITSalesV2 as follows:

在开始对数据库对象(实用程序)进行SQL单元测试之前,我们需要在示例数据库ITSalesV2中创建一个名为GetWeeklyReportStartEndDateTests的通用测试类,如下所示:

USE ITSalesV2
GO-- Creating unit test class GetWeeklyReportStartEndDateTests
CREATE SCHEMA [GetWeeklyReportStartEndDateTests]
Authorization dbo
GO
EXECUTE sp_addextendedproperty @name='tSQLt.TestClass',@value=1,@level0type='SCHEMA',@level0name='GetWeeklyReportStartEndDateTests'

TSQLt测试运行 (TSQLt Test Run)

Let us dry run SQL unit tests:

让我们空运行SQL单元测试:

-- Dry run sql unit tests
EXEC tsqlt.RunAll

编写实用程序GetWeeklyReportStartEndDate SQL单元测试 (Write utility procedure GetWeeklyReportStartEndDate SQL unit test )

Let us now write the SQL unit test for the utility procedure as follows:

现在让我们为实用程序编写SQL单元测试,如下所示:

--Create unit test to check object normal output for normal input template
CREATE PROCEDURE [GetWeeklyReportStartEndDateTests].[test to check object outputs normally when given normal input]
AS
-- Assemble
CREATE TABLE GetWeeklyReportStartEndDateTests.expected ( -- Creat expected tableCurrentDate DATETIME2,StartDate DATETIME2,EndDate DATETIME2);INSERT INTO GetWeeklyReportStartEndDateTests.expected -- Insert data into exepcted table
(CurrentDate, StartDate, EndDate)
VALUES
('14 May 2019','06 May 2019','12 May 2019')CREATE TABLE GetWeeklyReportStartEndDateTests.actual ( -- Creat actual tableCurrentDate DATETIME2,StartDate DATETIME2,EndDate DATETIME2);DECLARE @TheDATE DATETIME2 ='14 May 2019',@StartDate DATETIME2, @EndDate DATETIME2-- Act
EXEC GetWeeklyReportStartEndDate @CurrentDate=@TheDate -- call the utility procedure,@LastWeekStartDate=@StartDate OUTPUT,@LastWeekEndDate=@EndDate OUTPUTINSERT INTO GetWeeklyReportStartEndDateTests.actual -- put results into actual table
SELECT @TheDATE,@StartDate,@EndDate-- Assert (compare expected table with actual table results)
EXEC tSQLt.AssertEqualsTable @Expected='GetWeeklyReportStartEndDateTests.Expected',@Actual='GetWeeklyReportStartEndDateTests.Actual'

运行tSQLt测试 (Run tSQLt Tests)

Now run the tSQLt tests to see the results:

现在运行tSQLt测试以查看结果:

-- Run tsqls unit tests
EXEC tsqlt.RunAll

Congratulations, you have successfully completed the task of SQL unit testing the utility procedure which is now ready to be utilized by professional weekly reports to serve client business needs!

恭喜,您已经成功完成了SQL单元测试实用程序的任务,该实用程序现在可供专业每周报告使用,以满足客户的业务需求!

目录 (Table of contents)

tSQLt – A Forgotten Treasure in Database Unit Testing
Conventional SQL Unit Testing with tSQLt in Simple Words
Fundamentals of Test-Driven Database Development (TDDD) with tSQLt unit testing
10 Most Common SQL Unit Testing Mistakes
Why you should cleverly name Database Objects for SQL Unit Testing
Three Standard SQL Unit Tests you can write against any Stored Procedure
Creating SQL Unit Testing Utility Procedures with tSQLt
tSQLt –数据库单元测试中被遗忘的宝藏
简单单词中使用tSQLt进行的常规SQL单元测试
tSQLt单元测试的测试驱动数据库开发(TDDD)基础
10个最常见SQL单元测试错误
为什么要为SQL单元测试巧妙地命名数据库对象
您可以针对任何存储过程编写三个标准SQL单元测试
使用tSQLt创建SQL单元测试实用程序过程

翻译自: https://www.sqlshack.com/creating-sql-unit-testing-utility-procedures-with-tsqlt/

使用tSQLt创建SQL单元测试实用程序过程相关推荐

  1. sql初学者指南_使用tSQLt框架SQL单元测试面向初学者

    sql初学者指南 tSQLt is a powerful, open source framework for SQL Server unit testing. In this article, we ...

  2. @sql 单元测试_简单单词中使用tSQLt进行的常规SQL单元测试

    @sql 单元测试 This article is about basics of conventional SQL unit testing concepts and its implementat ...

  3. @sql 单元测试_10个最常见SQL单元测试错误

    @sql 单元测试 This SQL unit testing article is based on the fact that we often learn from the mistakes s ...

  4. sql重命名数据库_为什么要为SQL单元测试巧妙地命名数据库对象

    sql重命名数据库 This article is focussed on clever database object naming from both development and SQL un ...

  5. sql存储过程编写_您可以针对任何存储过程编写三个标准SQL单元测试

    sql存储过程编写 This article talks about the three standard SQL unit tests which can be written against an ...

  6. @sql 单元测试_SQL单元测试:使用异常

    @sql 单元测试 With this article, we will complete our journey with SQL Unit Testing. But first, let's re ...

  7. pl/sql 测试函数_如何在SQL单元测试中使用伪函数?

    pl/sql 测试函数 In this article series, we are exploring SQL unit testing, in general, and also we are r ...

  8. @sql 单元测试_SQL单元测试最佳实践

    @sql 单元测试 SQL unit testing is a testing method which allows us to test the smallest, atomic programm ...

  9. @sql 单元测试_如何在SQL单元测试中使用假表?

    @sql 单元测试 In this article on SQL unit testing, we will talk about how to isolate SQL unit tests from ...

最新文章

  1. 广东省哈工大(深圳)赛区赛事活动安排
  2. C#高级编程----错误和异常的总结
  3. 汇编语言--loop指令
  4. 2.5英寸硬盘何止“五脏俱全”(硬盘构造再揭秘之四)
  5. Java中如何读写cookie (二)
  6. c++/cli中调用C#类库中的out参数
  7. python打开文件并读取2进制_在Python中,哪些文件可以读取为文本,哪些文件可以读取为二进制?...
  8. 有的人能轻松学会Python编程,不是基础好,而是有了这些刷题网站
  9. collections模块之defaultdict
  10. docker容器的实践——综合项目一
  11. 计算机专业色弱限制,体检标准变成建议 色盲色弱能报高校计算机专业
  12. 学习笔记13--基于蜂窝移动通信的车联网技术
  13. Python+FFmpeg音视频格式转换
  14. 人工智能产业链:2021年中国人工智能产业链图谱|产业链全景图
  15. 十进制12345在32位计算机中的十六进制表示方法
  16. python 离群值 q1 q3_设第一分位数是Q1,第二分位数是Q2,第三分位数是Q3,那么四分位差(又称内距)则用 _________表示。_学小易找答案...
  17. Windows 改变CMD窗口颜色!
  18. Python:利用高德API获取公交路线并可视化
  19. python ftp下载文件
  20. 提取html中文字符,教你怎么在Html页面提取全部汉字

热门文章

  1. Tomcat环境开发技巧
  2. jboss eap6.1(4)(部署应用)
  3. js动态创建元素和删除
  4. 完成课件中的动手动脑的或需要验证的相关内容。
  5. hexo博客出现“Cannot GET/xxxx”的错误
  6. iOS中确认网络的方法
  7. PS网页设计教程——小贴士:在PS中创建复古的页面
  8. LeetCode(832)——翻转图像(JavaScript)
  9. c++--STL迭代器相关辅助函数
  10. 数据库---事务(二)