单体测试

软件开发人员把开发完了单个画面或页面(web开发)提交给独立的测试人员进行的测试的过程

单体测试简单的讲就是软件开发人员把开发完了单个画面或页面(web开发)提交给独立的测试人员进行的测试的过程。由于单体测试与其单体关联性不大甚至没有关联,所以会有不少人认为单体测试分量不重,太简单,从概念上讲单体测试确实简单,但是单体测试是以后系统测试的基础,如果单体测试不过关没有发现并曝漏出问题,那么对于整个系统来说将会存在很大的隐患和风险。

简介
单体测试的目的是发现软件设计人员在设计单体时错误和漏洞,以及开发人员的Bug和漏洞。不同的公司,不同的项目都具有自己的测试规范和要求,并且以文档的形式记录在案,单体测试人员应该严格按照测试规范和要求进行测试。但是,在实际的测试中,即使测试人员拿着具体的测试要求往往好多基本问题仍然没有发现,那么原因何在呢?不是他的测试方法不对,也不是测试时间不充分,而是测试人员不够严谨和仔细。软件测试是一件很辛苦的工作,有些项目会专门配有测试团队,有些可能是因为项目规模不大或者团队人员不足而没有专门的测试人员,开发人员之间相互进行单体测试。这时候可能是相互之间由于个人关系存在私心,导致测试结果不理想不能达到预期的要求,因为大多数软件开发公司都会将测试出来的Bug记录在案,在项目结束时要统计分析,甚至年终时评定年终奖作为重要的指标。
因此如果条件允许尽可能建立独立的测试团队,实在没有这样的资源,那么对测试人员必须有严格的要求,至少做到以下几点: 单体测试时测试人员首先要根据测试式样书看逐项检查开发者是否实现;其次要按照开发式样书的要求测试开发人员所有功能和需求是否全部实现;最后要提交测试结果报告书,开发人员修改后再测试。项目管理者要对测试结果进行抽查,如果发现Bug没有测试出来的原因是测试人员不够认真,这时要建立相应的处罚机制,比如说这个Bug不仅要记在开发人员身上,同时也要记在对应的测试人员身上。
注意事项
单体测试时需要注意几点:1、建立测试计划2、测试结果文档化 3、测试数据规范化 4、修改及时性。
举例说明
配置工程
为Objective-C代码创建测试用例
为C++代码创建测试用例
往工程中加入单体测试的第一步是创建一个新的目标,用于连编和运行相应的测试代码。在Xcode中,您可以创建类型为“单体测试程序包(Unit Test Bundle)”的连编目标。这种目标在连编时会对您的测试代码进行编译,并通过一个外壳脚本来运行该代码。在测试完成后,Xcode控制台会将所有失败的测试点报告为错误。
配置测试目标的时候,您需要决定目标的工作方式。Xcode带有的单体测试程序包可以以两种方式集成到您的执行程序中。一种是将测试目标配置为一个单独的实体,您可以独立地连编和运行主执行程序;另一种是在目标中加入依赖关系,使目标在每次连编时自动地连编您的执行程序,并进行测试。
单体测试-比较依赖于执行程序的目标和独立的目标
在建立测试代码的时候,您需要决定测试目标是依赖于主执行程序,还是与执行程序相独立。这两种技术各有各的优
独立
目标的建立比较简单,只在希望的时候运行。
必须手工运行,可能使用得不频繁。
依赖
测试的自动运行比较容易。允许开发者独立连编主执行程序。
目标的建立要求一些额外的步骤。不能使用零连接。
如果您正在写的是一个Objective-C的程序,配置一个依赖于主执行程序的目标需要的额外步骤最少。然而,如果是一个C或者C++程序,则需要更多的工作,当然,这些工作也比较直接。
您需要做的一个重要事情是决定执行测试的频繁程度。定期执行测试可以得到各个连编的错误报告。如果工程需要定期进行连编,则这种方式可以比较容易地跟踪导致问题的代码。
另外一个需要做的决定是在每个连编周期中希望进行哪些测试。如果您有几千个测试用例,则可能希望只在特定的检查点处执行测试,比如将修改提交到代码库之后的时刻,而不是每个连编都进行测试。将测试组合的名称作为命令行参数传递给定制的执行程序,就可以指定您希望运行的测试用例了。更多的信息请参见“运行测试代码”部分。
创建测试目标
无论是依赖于主执行程序的目标,还是独立的目标,其初始的配置过程都是一样的:
打开Xcode工程。
选择工程>新建目标(Project > New Target)菜单,显示新建目标(New Target)助手窗口。
单体测试-选择您期望的目标类型
如果您正在写的是一个Objective-C程序,则选择Cocoa > 单体测试程序包(Cocoa > Unit Test Bundle)目标。
如果您正在写的是一个C/C++程序,则选择Carbon > 单体测试程序包(Carbon > Unit Test Bundle)目标。这种目标不必使用Carbon库。
指定目标的名称,并点击完成(Finish)键。
在目标被创建时,其初始状态是一个独立的目标。如果您需要的就是独立的目标,则可以将代码和测试用例直接加入到目标中,并开始连编。如果您需要的是依赖于主执行程序的目标,那么反过来,必须进行下面的配置:
必须使您的目标依赖于主执行程序的目标(请参见“使目标依赖于主执行程序”部分)。
如果您的程序是用C或者C++写的,则必须在应用程序中加入代码,来对测试进行初始化(请参见“在C和C++工程中执行依赖于主执行程序的测试”部分)。对于基于Objective-C的测试,则不需要初始化。
使目标依赖于主执行程序
为了使您的目标依赖于主执行程序,必须在Xcode工程中为其建立依赖关系:
选择您的单体测试程序包目标。
打开该目标的查看器。
选择一般(General)页签。
点击位于窗口底部的+按键。
在出现的对话框中,选择代表主执行程序的目标,并点击增加目标(Add Target)键。
如果您正在连编的是一个应用程序,则还必须在程序包装载器(Bundle Loader)和测试宿主(Test Host) 这两个连编设置中指定应用程序的执行程序。举例来说,如果要设置MyApp.app的执行程序路径,需要执行如下的步骤:
选择单体测试程序包目标。
打开该工程的查看器。
选择连编(Build)页签。
选择连接(Linking)集合。
将程序包装载器设置赋值为$(BUILT_PRODUCTS_DIR)/MyApp.app/Contents/MacOS/MyApp。
选择单体测试(Unit Testing)集合。
将测试宿主设置赋值为$(BUILT_PRODUCTS_DIR)/MyApp.app/Contents/MacOS/MyApp。由于它们使用的是同样的值,所以也可以将这个设置赋值为$(BUNDLE_LOADER)。
请注意:如果您正在测试的是一个框架或者共享库,则不必为测试宿主设置指定值。
缺省情况下,程序包装载器和测试宿主设置是没有赋值的。对程序包装载器进行设置告诉连接器在连接时将指定的执行程序处理为额外的框架(这种处理方式有助于在连编测试目标的时候避免产生应用程序类的引用无法识别的错误)。对测试宿主进行设置则告诉RunUnitTests脚本(在最后的连编阶段执行)启动指定的应用程序,并将您的测试程序包注入到该程序中。
在测试目标配置完成之后,应该将它设置为活动目标,并往目标中加入包含测试用例代码的源文件。在下次编译的时候,Xcode会考察测试目标的依赖性,并首先连编您的主执行程序,之后再连编测试目标,并在完成之后运行您的测试用例。这个过程确保主程序被连编,且对应的测试用例被运行。
请注意:对于依赖于主执行程序的测试目标,只需要把将测试代码的源文件加入到工程中就可以了。不要将主执行程序的任何源文件加入到测试目标中。在测试代码运行的时候,测试目标程序包会被注入到主执行程序中,并可以访问测试需要的任何源代码。
在C和C++工程中执行依赖于主执行程序的测试
如果您在C++工程中使用依赖于主执行程序的测试目标,则需要在测试工程中加入一些额外的代码,才能执行测试。由于Objective-C的动态本质,依赖于主执行程序的测试目标产生的程序包可以被自动地注入到执行程序中。而在C++中,这是不可能的。相反,您必须显式告诉CPlusTest框架什么时候可以安全地运行测试代码。在Carbon应用程序中,实现这个目标的方法之一是建立一个定时器,使其处理函数在应用程序启动完成后马上启动测试组件,而且具有处理事件的能力。当定时器触发时,相应的处理函数就可以运行已经注册完成了的测试组件,并记录测试过程的输出(有关如何注册测试用例的信息,请参见“为C++代码创建测试用例”部分)。
列表1显示了Carbon程序中用于启动定时器的类定义。我们需要在初始化时构造该类的一个实例(参见列表2),目的是安装一个定时器。当定时器最终被触发时,程序就会调用firedTimerBridge和firedTimer方法来执行实际的测试。
主要区别
单体测试(白盒测试)阶段,不但要保证,程序能跑到和跑通所有对应本机能的开发的代码,同时也必须保证代码的质量(机上レビュー),是否符合规约,是否已经是最好,这个非常重要。遇到bug,及时进行确认和相关开发人员修正。单体测试完了,并将遇到bug进行修正完了,确认单体测试完毕,随后进入结合测试阶段。
结合测试(SI测试或称为黑盒测试),不是重复的单体测试。单体测试的时候,我们是站在理解业务的开发人员的角度上看的,能debug着进行测试,一旦进入结合测试阶段,我们就是站在客户观点上来对应测试了(除非非得debug解决不了的测试点,特殊!)。(与开发没有任何关联的人,可以进入这个阶段的测试。缘由是,已经不是程序的想法,而是业务的想法了。)结合测试的任务量应该至少是coding与单体测试量之和,应该最大限度做到不重复不漏。
测试的既包括单体的内容,也得把所有的异常通过case跑出来(在业务业面上正确显示出来),该错,不该错,能输入,不能输入,多次longin不入进行lock,多人同时更新一个表,排他测试(比如,测试数据库连接时候,可以断网测试一下,看是否是出现我们理想的提示信息)等等。(式样书的做成阶段)在做测试票与测试点或者测试case的时候,原则上大约1K的开发内容,要出六十到七十左右的测试点,多了或许就重复了,少了是不够用的或者不全面的。各个机能(画面)之间比较巧妙的连接,各个测试票之间的连接巧安排,包括联动,所有的CHECK,做尽量少的重复,尽量大的不漏。在真正进行结合测试的时候,可能会对应BUG修正的,这个时候,一定一定要控制好版本(管理)。对库(服务器代码所在)的进出严格控制。
每天的进度统计与把握对项目的顺利进行也非常重要。如果遇到式样变更,一定要有专门的式样变更管理,控制好限度,如果超过限度,要进行相应的协商,以免对纳品日期(工期)和品质产生大的影响。
全国各地天气预报查询

上海市

  • 市辖区
  • 云南省

  • 临沧市
  • 云南省

  • 丽江市
  • 云南省

  • 保山市
  • 云南省

  • 大理白族自治州
  • 云南省

  • 德宏傣族景颇族自治州
  • 云南省

  • 怒江傈僳族自治州
  • 云南省

  • 文山壮族苗族自治州
  • 云南省

  • 昆明市
  • 云南省

  • 昭通市
  • 云南省

  • 普洱市
  • 云南省

  • 曲靖市
  • 云南省

  • 楚雄彝族自治州
  • 云南省

  • 玉溪市
  • 云南省

  • 红河哈尼族彝族自治州
  • 云南省

  • 西双版纳傣族自治州
  • 云南省

  • 迪庆藏族自治州
  • 内蒙古自治区

  • 乌兰察布市
  • 内蒙古自治区

  • 乌海市
  • 内蒙古自治区

  • 兴安盟
  • 内蒙古自治区

  • 包头市
  • 内蒙古自治区

  • 呼伦贝尔市
  • 内蒙古自治区

  • 呼和浩特市
  • 内蒙古自治区

  • 巴彦淖尔市
  • 内蒙古自治区

  • 赤峰市
  • 内蒙古自治区

  • 通辽市
  • 内蒙古自治区

  • 鄂尔多斯市
  • 内蒙古自治区

  • 锡林郭勒盟
  • 内蒙古自治区

  • 阿拉善盟
  • 北京市

  • 市辖区
  • 吉林省

  • 吉林市
  • 吉林省

  • 四平市
  • 吉林省

  • 延边朝鲜族自治州
  • 吉林省

  • 松原市
  • 吉林省

  • 白城市
  • 吉林省

  • 白山市
  • 吉林省

  • 辽源市
  • 吉林省

  • 通化市
  • 吉林省

  • 长春市
  • 四川省

  • 乐山市
  • 四川省

  • 内江市
  • 四川省

  • 凉山彝族自治州
  • 四川省

  • 南充市
  • 四川省

  • 宜宾市
  • 四川省

  • 巴中市
  • 四川省

  • 广元市
  • 四川省

  • 广安市
  • 四川省

  • 德阳市
  • 四川省

  • 成都市
  • 四川省

  • 攀枝花市
  • 四川省

  • 泸州市
  • 四川省

  • 甘孜藏族自治州
  • 四川省

  • 眉山市
  • 四川省

  • 绵阳市
  • 四川省

  • 自贡市
  • 四川省

  • 资阳市
  • 四川省

  • 达州市
  • 四川省

  • 遂宁市
  • 四川省

  • 阿坝藏族羌族自治州
  • 四川省

  • 雅安市
  • 天津市

  • 市辖区
  • 宁夏回族自治区

  • 中卫市
  • 宁夏回族自治区

  • 吴忠市
  • 宁夏回族自治区

  • 固原市
  • 宁夏回族自治区

  • 石嘴山市
  • 宁夏回族自治区

  • 银川市
  • 安徽省

  • 亳州市
  • 安徽省

  • 六安市
  • 安徽省

  • 合肥市
  • 安徽省

  • 安庆市
  • 安徽省

  • 宣城市
  • 安徽省

  • 宿州市
  • 安徽省

  • 池州市
  • 安徽省

  • 淮北市
  • 安徽省

  • 淮南市
  • 安徽省

  • 滁州市
  • 安徽省

  • 芜湖市
  • 安徽省

  • 蚌埠市
  • 安徽省

  • 铜陵市
  • 安徽省

  • 阜阳市
  • 安徽省

  • 马鞍山市
  • 安徽省

  • 黄山市
  • 山东省

  • 东营市
  • 山东省

  • 临沂市
  • 山东省

  • 威海市
  • 山东省

  • 德州市
  • 山东省

  • 日照市
  • 山东省

  • 枣庄市
  • 山东省

  • 泰安市
  • 山东省

  • 济南市
  • 山东省

  • 济宁市
  • 山东省

  • 淄博市
  • 山东省

  • 滨州市
  • 山东省

  • 潍坊市
  • 山东省

  • 烟台市
  • 山东省

  • 聊城市
  • 山东省

  • 菏泽市
  • 山东省

  • 青岛市
  • 山西省

  • 临汾市
  • 山西省

  • 吕梁市
  • 山西省

  • 大同市
  • 山西省

  • 太原市
  • 山西省

  • 忻州市
  • 山西省

  • 晋中市
  • 山西省

  • 晋城市
  • 山西省

  • 朔州市
  • 山西省

  • 运城市
  • 山西省

  • 长治市
  • 山西省

  • 阳泉市
  • 广东省

  • 东莞市
  • 广东省

  • 中山市
  • 广东省

  • 云浮市
  • 广东省

  • 佛山市
  • 广东省

  • 广州市
  • 广东省

  • 惠州市
  • 广东省

  • 揭阳市
  • 广东省

  • 梅州市
  • 广东省

  • 汕头市
  • 广东省

  • 汕尾市
  • 广东省

  • 江门市
  • 广东省

  • 河源市
  • 广东省

  • 深圳市
  • 广东省

  • 清远市
  • 广东省

  • 湛江市
  • 广东省

  • 潮州市
  • 广东省

  • 珠海市
  • 广东省

  • 肇庆市
  • 广东省

  • 茂名市
  • 广东省

  • 阳江市
  • 广东省

  • 韶关市
  • 广西壮族自治区

  • 北海市
  • 广西壮族自治区

  • 南宁市
  • 广西壮族自治区

  • 崇左市
  • 广西壮族自治区

  • 来宾市
  • 广西壮族自治区

  • 柳州市
  • 广西壮族自治区

  • 桂林市
  • 广西壮族自治区

  • 梧州市
  • 广西壮族自治区

  • 河池市
  • 广西壮族自治区

  • 玉林市
  • 广西壮族自治区

  • 百色市
  • 广西壮族自治区

  • 贵港市
  • 广西壮族自治区

  • 贺州市
  • 广西壮族自治区

  • 钦州市
  • 广西壮族自治区

  • 防城港市
  • 新疆维吾尔自治区

  • 乌鲁木齐市
  • 新疆维吾尔自治区

  • 伊犁哈萨克自治州
  • 新疆维吾尔自治区

  • 克孜勒苏柯尔克孜自治州
  • 新疆维吾尔自治区

  • 克拉玛依市
  • 新疆维吾尔自治区

  • 博尔塔拉蒙古自治州
  • 新疆维吾尔自治区

  • 吐鲁番市
  • 新疆维吾尔自治区

  • 和田地区
  • 新疆维吾尔自治区

  • 哈密市
  • 新疆维吾尔自治区

  • 喀什地区
  • 新疆维吾尔自治区

  • 塔城地区
  • 新疆维吾尔自治区

  • 巴音郭楞蒙古自治州
  • 新疆维吾尔自治区

  • 昌吉回族自治州
  • 新疆维吾尔自治区

  • 自治区直辖县级行政区划
  • 新疆维吾尔自治区

  • 阿克苏地区
  • 新疆维吾尔自治区

  • 阿勒泰地区
  • 江苏省

  • 南京市
  • 江苏省

  • 南通市
  • 江苏省

  • 宿迁市
  • 江苏省

  • 常州市
  • 江苏省

  • 徐州市
  • 江苏省

  • 扬州市
  • 江苏省

  • 无锡市
  • 江苏省

  • 泰州市
  • 江苏省

  • 淮安市
  • 江苏省

  • 盐城市
  • 江苏省

  • 苏州市
  • 江苏省

  • 连云港市
  • 江苏省

  • 镇江市
  • 江西省

  • 上饶市
  • 江西省

  • 九江市
  • 江西省

  • 南昌市
  • 江西省

  • 吉安市
  • 江西省

  • 宜春市
  • 江西省

  • 抚州市
  • 江西省

  • 新余市
  • 江西省

  • 景德镇市
  • 江西省

  • 萍乡市
  • 江西省

  • 赣州市
  • 江西省

  • 鹰潭市
  • 河北省

  • 保定市
  • 河北省

  • 唐山市
  • 河北省

  • 廊坊市
  • 河北省

  • 张家口市
  • 河北省

  • 承德市
  • 河北省

  • 沧州市
  • 河北省

  • 石家庄市
  • 河北省

  • 秦皇岛市
  • 河北省

  • 衡水市
  • 河北省

  • 邢台市
  • 河北省

  • 邯郸市
  • 河南省

  • 三门峡市
  • 河南省

  • 信阳市
  • 河南省

  • 南阳市
  • 河南省

  • 周口市
  • 河南省

  • 商丘市
  • 河南省

  • 安阳市
  • 河南省

  • 平顶山市
  • 河南省

  • 开封市
  • 河南省

  • 新乡市
  • 河南省

  • 洛阳市
  • 河南省

  • 漯河市
  • 河南省

  • 濮阳市
  • 河南省

  • 焦作市
  • 河南省

  • 省直辖县级行政区划
  • 河南省

  • 许昌市
  • 河南省

  • 郑州市
  • 河南省

  • 驻马店市
  • 河南省

  • 鹤壁市
  • 浙江省

  • 丽水市
  • 浙江省

  • 台州市
  • 浙江省

  • 嘉兴市
  • 浙江省

  • 宁波市
  • 浙江省

  • 杭州市
  • 浙江省

  • 温州市
  • 浙江省

  • 湖州市
  • 浙江省

  • 绍兴市
  • 浙江省

  • 舟山市
  • 浙江省

  • 衢州市
  • 浙江省

  • 金华市
  • 海南省

  • 三亚市
  • 海南省

  • 三沙市
  • 海南省

  • 儋州市
  • 海南省

  • 海口市
  • 海南省

  • 省直辖县级行政区划
  • 湖北省

  • 十堰市
  • 湖北省

  • 咸宁市
  • 湖北省

  • 孝感市
  • 湖北省

  • 宜昌市
  • 湖北省

  • 恩施土家族苗族自治州
  • 湖北省

  • 武汉市
  • 湖北省

  • 省直辖县级行政区划
  • 湖北省

  • 荆州市
  • 湖北省

  • 荆门市
  • 湖北省

  • 襄阳市
  • 湖北省

  • 鄂州市
  • 湖北省

  • 随州市
  • 湖北省

  • 黄冈市
  • 湖北省

  • 黄石市
  • 湖南省

  • 娄底市
  • 湖南省

  • 岳阳市
  • 湖南省

  • 常德市
  • 湖南省

  • 张家界市
  • 湖南省

  • 怀化市
  • 湖南省

  • 株洲市
  • 湖南省

  • 永州市
  • 湖南省

  • 湘潭市
  • 湖南省

  • 湘西土家族苗族自治州
  • 湖南省

  • 益阳市
  • 湖南省

  • 衡阳市
  • 湖南省

  • 邵阳市
  • 湖南省

  • 郴州市
  • 湖南省

  • 长沙市
  • 甘肃省

  • 临夏回族自治州
  • 甘肃省

  • 兰州市
  • 甘肃省

  • 嘉峪关市
  • 甘肃省

  • 天水市
  • 甘肃省

  • 定西市
  • 甘肃省

  • 平凉市
  • 甘肃省

  • 庆阳市
  • 甘肃省

  • 张掖市
  • 甘肃省

  • 武威市
  • 甘肃省

  • 甘南藏族自治州
  • 甘肃省

  • 白银市
  • 甘肃省

  • 酒泉市
  • 甘肃省

  • 金昌市
  • 甘肃省

  • 陇南市
  • 福建省

  • 三明市
  • 福建省

  • 南平市
  • 福建省

  • 厦门市
  • 福建省

  • 宁德市
  • 福建省

  • 泉州市
  • 福建省

  • 漳州市
  • 福建省

  • 福州市
  • 福建省

  • 莆田市
  • 福建省

  • 龙岩市
  • 西藏自治区

  • 山南市
  • 西藏自治区

  • 拉萨市
  • 西藏自治区

  • 日喀则市
  • 西藏自治区

  • 昌都市
  • 西藏自治区

  • 林芝市
  • 西藏自治区

  • 那曲市
  • 西藏自治区

  • 阿里地区
  • 贵州省

  • 六盘水市
  • 贵州省

  • 安顺市
  • 贵州省

  • 毕节市
  • 贵州省

  • 贵阳市
  • 贵州省

  • 遵义市
  • 贵州省

  • 铜仁市
  • 贵州省

  • 黔东南苗族侗族自治州
  • 贵州省

  • 黔南布依族苗族自治州
  • 贵州省

  • 黔西南布依族苗族自治州
  • 辽宁省

  • 丹东市
  • 辽宁省

  • 大连市
  • 辽宁省

  • 抚顺市
  • 辽宁省

  • 朝阳市
  • 辽宁省

  • 本溪市
  • 辽宁省

  • 沈阳市
  • 辽宁省

  • 盘锦市
  • 辽宁省

  • 营口市
  • 辽宁省

  • 葫芦岛市
  • 辽宁省

  • 辽阳市
  • 辽宁省

  • 铁岭市
  • 辽宁省

  • 锦州市
  • 辽宁省

  • 阜新市
  • 辽宁省

  • 鞍山市
  • 重庆市

  • 重庆市

  • 市辖区
  • 陕西省

  • 咸阳市
  • 陕西省

  • 商洛市
  • 陕西省

  • 安康市
  • 陕西省

  • 宝鸡市
  • 陕西省

  • 延安市
  • 陕西省

  • 榆林市
  • 陕西省

  • 汉中市
  • 陕西省

  • 渭南市
  • 陕西省

  • 西安市
  • 陕西省

  • 铜川市
  • 青海省

  • 果洛藏族自治州
  • 青海省

  • 海东市
  • 青海省

  • 海北藏族自治州
  • 青海省

  • 海南藏族自治州
  • 青海省

  • 海西蒙古族藏族自治州
  • 青海省

  • 玉树藏族自治州
  • 青海省

  • 西宁市
  • 青海省

  • 黄南藏族自治州
  • 黑龙江省

  • 七台河市
  • 黑龙江省

  • 伊春市
  • 黑龙江省

  • 佳木斯市
  • 黑龙江省

  • 双鸭山市
  • 黑龙江省

  • 哈尔滨市
  • 黑龙江省

  • 大兴安岭地区
  • 黑龙江省

  • 大庆市
  • 黑龙江省

  • 牡丹江市
  • 黑龙江省

  • 绥化市
  • 黑龙江省

  • 鸡西市
  • 黑龙江省

  • 鹤岗市
  • 黑龙江省

  • 黑河市
  • 黑龙江省

  • 齐齐哈尔市