
发表日期: 2021-04-25 10:49:05 浏览次数:104
泰州网站制作【泰州网站优化】泰州建网站、泰州微信公众号运营、泰州网页设计、泰州微信小程序商城
泰州,简称“泰”,古称海陵,是江苏省地级市,长江三角洲中心区27城之一 [1] ,国务院批复确定的中国长江三角洲地区重要的工贸港口城市 [2] 。截至2018年,全市下辖3个区、代管3个县级市,总面积5787.26平方千米,常住人口463.57万人,城镇人口305.96万人,城镇化率66.0%,全年实现社会消费品零售总额1282.87亿元。 [3]
泰州地处中国华东地区、江苏中部,是扬子江城市群重要组成部分,南濒长江、北邻盐城、东临南通、西接扬州,是承南启北的水陆要津,为苏中门户,自古有“水陆要津,咽喉据郡”之称。700多年前,马可·波罗游历泰州,称赞“这城不很大,但各种尘世的幸福极多”。 [4]
泰州是国家历史文化名城,秦称海阳,汉称海陵,州建南唐,文昌北宋。南唐时(公元937年)为州治,取“国泰民安”之意,始名泰州。泰州人文荟萃、名贤辈出,“儒风之盛,素冠淮南”。王艮、刘熙载、施耐庵、郑板桥、梅兰芳是泰州文化艺术史上的杰出代表。 [4]
泰州所辖县市(区)全部建成国家级生态示范区、全国百强县,同时泰州也是全国文明城市 [5] 、国家环保模范城市 [6] 、国家园林城市、中国优秀旅游城市、全国科技进步先进市、第一批国家农业可持续发展试验示范区。2017年中国地级市全面小康指数排名第42 [7] 。
2018年11月,入选中国城市全面小康指数前100名。 [8] 12月,被评为2018中国大陆最佳商业城市100强。2020年10月9日,被生态环境部授予第四批国家生态文明建设示范市县称号。2020年10月,被评为全国双拥模范城(县)。
c2/9/SoundexTest.cpp
TEST(SoundexEncoding,RetainsSoleLetterOfOneLetterWord){
Soundex soundex;
auto encoded = soundex.encode("A");➤ ASSERT_THAT(encoded, Eq("A000"));
}复制代码如上述代码所示,让第一个测试通过并不难!
现在有两个大体相同的测试,只是数据稍微有点差别。这没关系。每个测试分别描述一种行为。我们不仅要确保系统按预期工作,还要让每个人知道所有既定的系统行为。
是时候重构了。encode()中的代码在描述其中可能发生的操作时有点模糊其词。我们决定提取独立的方法(Method),配以意图明确的名字。
c2/10/SoundexTest.cpp
public:
std::string encode(const std::string& word) const {➤ return zeroPad(word);
}
private:➤ std::string zeroPad(const std::string& word) const {➤ return word + "000";➤ }复制代码在重构的时候,不仅要审阅产品代码,还要审阅测试。如上所述,我们的测试都需要创建Soundex类实例,并且使用相同的代码。我们不乐意看到此类貌似无关紧要的重复代码。这些重复会积累得很快,并且通常会演变为更复杂的重复代码。这也会让测试变得有点主次不分,对于阅读代码的人来说,这会分散注意力,从而忽视真正需要关注的重要内容。
相关测试拥有一些共同的代码是常见的。Google Mock允许我们定义一个fixture类,我们可以在这个类中为相关的测试声明函数和数据。(从技术角度说,所有的Google Mock测试都使用一个由Google Mock自己生成的fixture。)
c2/10/SoundexTest.cpp
➤ class SoundexEncoding : public testing::Test {➤ public:➤ Soundex soundex;➤ };➤ TEST_F(SoundexEncoding, RetainsSoleLetterOfOneLetterWord) {
auto encoded = soundex.encode("A");
ASSERT_THAT(encoded, Eq("A000"));
}➤ TEST_F(SoundexEncoding, PadsWithZerosToEnsureThreeDigits) {
auto encoded = soundex.encode("I");
ASSERT_THAT(encoded, Eq("I000"));
}复制代码我们在上述代码中创建了一个名为SoundexEncoding的fixture(必须从::testing::Test继承)。这样,创建Soundex类实例就在一个地方完成了。在fixture内部,我们声明了公共成员变量soundex,以便测试可以访问。(如果你对暴露变量soundex有点担心的话,记住fixture类只在这个.cpp文件中。我们想避免在测试中加入多余的杂乱代码。)
Google Mock会在运行每个测试时创建fixture类实例。在Google Mock运行RetainSole- LetterOfOneLetterWord前,它先创建一个SoundexEncoding类实例。在运行PadsWithZeroTo- EnsureThreeDigits前,创建另外一个SoundexEncoding类实例。为了使用自定义的fixture,我们把TEST宏替换为TEST_F,F表示fixture。如果忘记使用TEST_F,任何使用了fixture类成员的测试代码都会编译失败。
现在,可以删掉测试内的局部变量soundex,因为每个测试都可以访问fixture中的成员。我们增量地作出这些代码改动。在定义完fixture类并修改宏处理后,我们从第一个测试中删掉局部变量soundex。运行所有的测试来验证这个改动,继而删掉第二个测试中的局部变量soundex,然后再次运行所有的测试。
去掉测试中重复的Soundex类实例定义至少会产生下面两个影响。
提升了测试的抽象度。现在,每个测试中只包含两行代码,这有助于我们集中精力关注与测试相关的东西。我们也看不到Soundex类实例是怎样构造出这一不相干的细节的。
可以降低未来维护测试的开销。试想一下我们必须改变Soundex类实例的构造方式(譬如我们需要能够将语言种类作为一个构造函数的参数)。将Soundex类实例的构造放到fixture中,这意味着改动一个地方即可。否则,要改动每个测试。
每个测试只有两行代码,这让测试更具可读性。还可以做些什么呢?我们可以让每个测试只有一行代码,同时保持可读性。另外,我也不是显式使用using指示符的拥趸,所以也可以去掉它。
c2/11/SoundexTest.cpp
#include "gmock/gmock.h"➤ #include "Soundex.h"➤ using namespace testing;➤ class SoundexEncoding: public Test {
public:
Soundex soundex;
};
TEST_F(SoundexEncoding, RetainsSoleLetterOfOneLetterWord) {➤ ASSERT_THAT(soundex.encode("A"), Eq("A000"));
}
TEST_F(SoundexEncoding, PadsWithZerosToEnsureThreeDigits) {➤ ASSERT_THAT(soundex.encode("I"), Eq("I000"));
}复制代码从上述代码中可以看到,测试仅仅引用了Soundex.h头文件。短期内,测试和产品代码同在一个文件是有益的。但现在,我们需要在一个文件中不断地拉上拉下,所以有点费力。先把测试和头文件分开(稍后再决定是否应该创建.impl文件),下面是头文件。
c2/11/Soundex.h
➤ #ifndef Soundex_h➤ #define Soundex_h
#include <string>
class Soundex
{
public:
std::string encode(const std::string& word) const {
return zeroPad(word);
}
private:
std::string zeroPad(const std::string& word) const {
return word + "000";
}
};➤ #endif复制代码简单地说,TDD的周期就是写一个测试,先确保测试失败,然后编码让测试通过,接着审阅代码和打磨设计(包括测试的设计),最后确保所有测试依然通过。在一天的工作中,你不断地重复此周期,保持周期短小,以便得到最多的反馈。虽然是重复,但绝非盲目,每一个周期你都需要思考很多事情。
为了保持事情持续推进,假定你遵从了上面提到的步骤,我只会偶尔提醒一下。你可以在显示器边上贴一个便签用作提醒。
在下一个测试中,我们将处理规则2(即在第一个字母后,用数字替换辅音)。替换规则表中说字母b对应数字1。那就先写个这样的测试,如下:
c2/12/SoundexTest.cpp
TEST_F(SoundexEncoding, RetainsSoleLetterOfOneLetterWord) {➤ ASSERT_THAT(soundex.encode("Ab"), Eq("A100"));
}复制代码不出意料,测试失败了。
Value of: soundex.encode("Ab")Expected: is equal to 0x80b8a5f pointing to "A100"
Actual: "Ab000" (of type std::string)复制代码如大部分要写的测试一样,对应的解决方案可能枚不胜举,但可能只有少量是合理的。从技术角度讲,唯一要做的是让这个测试通过,然后打磨我们的解决方案。

服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878